我在 Visual Studio 2012 中创建一个函数来检查某项是否为默认项,并将其命名为 default()
。然而,我注意到当我完成并等待几秒钟时,名称不再是粗体,并且没有显示智能感知错误。出于好奇,我尝试了一下:
void default(){}
int main() {
default();
}
此代码可在使用常规编译器和 2012 年 11 月 CTP 编译器的 Visual Studio 2012 上运行,但无法在 GCC 4.7.2 或 http://llvm.org/demo 上编译。 。我意识到 default
用于两个开关以及某些类成员的 = default
。 VS2012不支持后者,但它显然支持前者,并且如果我将函数名称更改为delete
、nullptr
或switch<,它确实会提示
或 case
。
在 GCC 上,我得到这个:
error: expected unqualified-id before 'default'
In function 'int main()':
error: case label not within a switch statement
error: expected ':' before '(' token
error: expected primary-expression before ')' token
Clang 给了我这个:
error: expected unqualified-id
void default(){}
........^
我现在显然正在更改它的名称,但是 VS 接受这一点是错误的,或者它是否可能通过 = default
和 = delete
添加进行了专门更改到语言?如果 VS 不支持这一点,并且这就是程序错误的原因,我可以明白为什么它接受它。
我在规范 (C++11 § 6.1/2) 中找到了这一点:
Case labels and default labels shall occur only in switch statements.
由于它没有被用作标签,后面有冒号,我想可以说它是允许的,但是为什么 case
会编译呢?我猜想有一些更具体的函数名称,但我找不到它。
是否允许命名函数 default()
,C++03 和 C++11 之间的规则是否不同?
最佳答案
default
标识符保留用作关键字:
The identifiers shown in Table 4 are reserved for use as keywords (that is, they are unconditionally treated as keywords in phase 7) except in an attribute-token
表 4† 除所有其他关键字外,还包含 default
。 VC++ 错误地接受属性 token 之外的default
标识符,并且函数名称不是属性 token ..
† C++11 中是表 4,C++98 和 03 中是表 3。尽管如此,它们都包含 default
。
关于c++ - 函数可以命名为default吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13661328/