今天,我找到了一块与以下内容相等的代码:
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中定义),则该名称的声明(或声明集)应在模板定义中出现名称出现的点处。