Sha*_*our 13 c++ undefined-behavior language-lawyer c++11
在gcc中禁用检查覆盖的问题的答案建议-Doverride=
在命令行上使用以禁用错误使用覆盖的错误,这实际上与添加:
#define override
Run Code Online (Sandbox Code Playgroud)
到源文件.
我最初的反应是,这似乎是未定义的行为,因为我们正在重新定义关键字但是查看草案C++ 11标准部分2.12
关键字[lex.key]我很惊讶,无论是覆盖还是最终都不是关键字.它们在上一节2.11
[lex.name]中有所介绍,它说它们是具有特殊含义的标识符:
表3中的标识符在特定情况下出现时具有特殊含义[...]
和表3中被标记为具有特殊的含义标识符,并且包括覆盖和最后.
问题是,重新定义(使用#define)具有特殊含义的标识符是不确定的行为?在这方面,他们的待遇是否与关键词不同?
Sha*_*our 12
如果您使用的是C++标准库,则重新定义具有特殊含义的标识符是未定义的行为,这也适用于关键字.从17.6.4
[约束]部分的C++ 11标准草案中,我们有17.6.4.1
[constraints.overview]部分,其中说:
本节描述了对使用C++标准库的工具的C++程序的限制[...]
在17.6.4
我们的章节17.6.4.3.1
[macro.names]下面写着:
翻译单元不得#define或#undef名称与关键字词汇相同,与表3中列出的标识符或7.6中描述的属性标记相同.
表3列出了具有特殊含义的标识符.我们可以看到这一段也涵盖了关键字,它们也以相同的方式处理.