不存在的标识符在非启用函数模板中用作默认参数



今天,我找到了一块与以下内容相等的代码:

enum X
{
    x1 = 0,
    x2 = 1
};
template<typename T>
void bar(T obj, X x = x3) { }
//                    ^^
//                    This identifier is bogus!
int main() { }

VC10和VC12都愉快地编译了它。Clang 3.4和GCC 4.8.1都拒绝它(这是我期望的)。

这是一个错误,还是标准实际允许的VC行为?如果是这样,哪些是相关的段落?

这是一个众所周知的事实,即VC没有两相查找。这意味着它在模板中接受了各种虚假性,只要它至少看起来像是句法有效的C ,并且实际上并未实例化。

这只是其中的另一个实例。

您可以在其一致性路线图中看到,计划在RTM后CTP之后的某个时候进行两阶查找,我想这意味着您将在为Visual Studio Suite的下一次迭代付费后可以访问它。

至于标准参考,14.6/9-10说:

在寻找模板定义中使用的名称的声明时,通常使用通常的查找规则(3.4.1,3.4.2)用于非依赖性名称。[...]

如果名称不取决于模板参数(如14.6.2中定义),则该名称的声明(或声明集)应在模板定义中出现名称出现的点处。

最新更新