c++ - 函数可以命名为default吗?

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

我在 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不支持后者,但它显然支持前者,并且如果我将函数名称更改为deletenullptrswitch<,它确实会提示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/

相关文章:

c++ - 为什么具有 const 成员的结构可以赋值?

c++ - 修改虚函数中的基类

c++ - 如何解释 CUDA 的 inline PTX Internal Compiler Error

c++ - 计算 3D 对象和点之间的角度

visual-studio-2012 - VS2012 中缺少系统组件的文档

c++ - 通过 lambda 表达式初始化变量?

c++ - 关于 c++11 中的 std::result_of

c++ - 关于类型移动语义的注意事项

c++ - 结构的选择排序

c++ - 正弦波生成数据