我在 Visual Studio 2012 中创建了一个函数来检查一个项目是否是默认项目并去调用它default()
。但是,我注意到当我完成并等待几秒钟后,名称不再加粗,并且没有显示 Intellisense 错误。很感兴趣,我试了一下:
void default(){}
int main() {
default();
}
此代码适用于具有常规编译器和 2012 年 11 月 CTP 编译器的 Visual Studio 2012,但不能在 GCC 4.7.2 或http://llvm.org/demo上编译。我意识到这default
用于开关和= default
某些班级成员。VS2012不支持后者,但它显然支持前者,如果我将函数名更改为delete
, nullptr
, or switch
, or确实会报错case
。
在 GCC 上,我得到了这个:
错误:“默认”之前的预期 unqualified-id
在函数“int main()”中:
错误:case 标签不在 switch 语句中
错误:预期的“:”在“(”标记
之前)错误:预期的主表达式在“)”标记之前
Clang给了我这个:
错误:预期的不合格 ID
void default(){}
........^
我现在显然正在更改它的名称,但是 VS 接受这个是错误的,或者它是否可能随着语言的添加而特别= default
改变= delete
?如果 VS 不支持,这就是程序出错的原因,我可以理解它为什么接受它。
我在规范中发现了这一点(C++11 § 6.1/2):
案例标签和默认标签应仅出现在 switch 语句中。
由于它没有被用作标签,后面有冒号,我想可以说它是允许的,但是为什么要case
编译呢?我猜有一些更具体的函数名称,但我找不到它。
您是否允许命名函数default()
,C++03 和 C++11 之间的规则是否不同?