函数可以命名为default吗?

时间:2012-12-01 16:32:29

标签: c++ visual-studio-2012 c++11 keyword

我在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不支持后者,但它显然支持前者,如果我将函数名称更改为deletenullptrswitch或{{1},它确实会抱怨}。

在海湾合作委员会,我明白了:

  

错误:在'默认'之前预期的不合格ID   在函数'int main()'中:
  错误:案例标签不在switch语句中   错误:预期':'之前'('标记
  错误:')'令牌

之前的预期主要表达式

Clang给了我这个:

  

错误:预期不合格的身份
  void default(){}
  ........ ^

我现在显然正在改变它的名称,但接受这个是VS错了,或者它是否特别改变了case= default语言的添加?如果VS不支持,并且这是程序错误的原因,我可以看出为什么它接受它。

我在规范中找到了这个(C ++11§6.1/ 2):

  

案例标签和默认标签只能在switch语句中出现。

由于它没有被用作标签,冒号跟随它,我想可以说它是允许的,但是为什么= delete会编译?我猜测有一些更具体的功能名称,但我找不到它。

您是否可以命名函数case,并且规则在C ++ 03和C ++ 11之间是否有所不同?

2 个答案:

答案 0 :(得分:3)

default标识符保留用作关键字:

  

表4中显示的标识符保留用作关键字(即,在第7阶段无条件地将它们视为关键字),但 attribute-token

除外

表4 包含所有其他关键字default。 VC ++在属性标记之外接受default的标识符是错误的,而函数名称不是属性标记 ..

这是C ++ 11中的表4,但是C ++ 98和03中的表3.尽管如此,它们都包含default

答案 1 :(得分:2)

这是不允许的。您不能在函数或变量的声明中使用任何C ++关键字。没有例外。所有C ++标准中的规则都是相同的。