2

我在 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 之间的规则是否不同?

4

2 回答 2

3

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

表 4 中显示的标识符保留用作关键字(即,它们在阶段 7 中被无条件地视为关键字),但在属性标记中除外

表 4 †</sup> 在所有其他关键字中包含default. VC++ 错误地接受属性标记default之外的标识符,并且函数名不是属性标记..

†</sup> 是 C++11 中的表 4,但 C++98 和 03 中的表 3。尽管如此,它们都包含default.

于 2012-12-01T16:36:13.330 回答
2

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

于 2012-12-01T16:33:28.800 回答