我在Visual Studio 2012中创建了一个函数,以检查某个项是否为默认值,然后调用它default()
。但是,我注意到,当我完成并等待几秒钟后,该名称不再加粗,并且没有显示Intellisense错误。好奇,我试了一下:
void default(){}
int main() {
default();
}
此代码适用于Visual Studio 2012,包含常规编译器和2012年11月的CTP版本,但不能在GCC 4.7.2或http://llvm.org/demo上编译。我意识到default
用于交换机和= default
用于某些类成员。 VS2012不支持后者,但它显然支持前者,如果我将函数名称更改为delete
,nullptr
或switch
或{{1},它确实会抱怨}。
在海湾合作委员会,我明白了:
错误:在'默认'之前预期的不合格ID 在函数'int main()'中:
之前的预期主要表达式
错误:案例标签不在switch语句中 错误:预期':'之前'('标记
错误:')'令牌
Clang给了我这个:
错误:预期不合格的身份
void default(){}
........ ^
我现在显然正在改变它的名称,但接受这个是VS错了,或者它是否特别改变了case
和= default
语言的添加?如果VS不支持,并且这是程序错误的原因,我可以看出为什么它接受它。
我在规范中找到了这个(C ++11§6.1/ 2):
案例标签和默认标签只能在switch语句中出现。
由于它没有被用作标签,冒号跟随它,我想可以说它是允许的,但是为什么= delete
会编译?我猜测有一些更具体的功能名称,但我找不到它。
您是否可以命名函数case
,并且规则在C ++ 03和C ++ 11之间是否有所不同?
答案 0 :(得分:3)
default
标识符保留用作关键字:
表4中显示的标识符保留用作关键字(即,在第7阶段无条件地将它们视为关键字),但 attribute-token
除外
表4 †包含所有其他关键字default
。 VC ++在属性标记之外接受default
的标识符是错误的,而函数名称不是属性标记 ..
†这是C ++ 11中的表4,但是C ++ 98和03中的表3.尽管如此,它们都包含default
。
答案 1 :(得分:2)
这是不允许的。您不能在函数或变量的声明中使用任何C ++关键字。没有例外。所有C ++标准中的规则都是相同的。