{+ 3}}和override specifier都是在C ++ 11中添加的。它们与添加到C ++ 11中的其他说明符不同,例如final specifier和constexpr,因为它们不是decltype,因此可用作标识符:
int main()
{
int override = 0 ; // Ok
int final = 0 ; // Ok
//int constexpr = 0 ; // Error
}
它们被称为具有特殊含义的标识符,草案C ++ 11标准部分2.11
[lex.name] ( 强调我的):
表3中的标识符在出现时具有特殊含义 在某种情况下。当在语法中提到时,这些 标识符是显式使用而不是使用标识符 语法生成。关于给定标识符是否有任何歧义 解决了将令牌解释为常规的特殊含义 标识符
和表3 - 具有特殊含义的标识符列出覆盖和最终。
为什么这两个说明符最终是具有特殊含义的标识符而不是关键字?
答案 0 :(得分:35)
添加新关键字很困难,因为它会从用户那里拿走标识符。它最终是在选择可能破坏当前使用标识符的旧代码的标识符或选择极不可能破坏旧代码但是丑陋或对它们的方式没有意义的名称之间进行权衡使用
在这种特定情况下, override 和 final 最终会在没有用户标识符出现的地方的语法中使用。因此,在那些地方,标识符可以具有特殊含义,并且在这些上下文之外,它们可以被视为常规标识符,从而使标识符可供用户使用。自C++/CLI
以来2005
使用了这种技术,它们被称为上下文相关关键字,C++/CLI standard部分9.1.1
标识符中包含这些关键字。
我们可以在文章中看到,解决了在N3163: Override Control Using Contextual Keywords中添加对虚拟控制属性的支持的不同方法的权衡。它讨论了三个选项:
使用[[attributes]]
,这被认为是不受欢迎的原因,包括它们只是伪装的关键词(以下论文的修改示例):
class A : public B { virtual void f [[override]] () { ... } virtual void h [[final]] () { ... } };
使用保留关键字,除非选择了丑陋的名称,否则可能会破坏现有代码(以下文件中的修改示例):
class A : public B { virtual void f override_func () { ... } virtual void h final_func () { ... } };
使用上下文相关的关键字,它不会破坏现有代码,允许漂亮的名称(修改后的例子 ):
class A : public B { virtual void f() override { ... } virtual void h() final { ... } };
本文的以下段落总结了使用上下文敏感关键字而不是其他两个选项(强调我的)的论点:
在拉珀斯维尔观察到这种方法可以做到 错误恢复和语法突出显示更加困难。例如, 语法突出显示有点难,因为而不是全局 突出显示您需要解析的关键字,以了解是否 标识符位于具有特殊含义的位置 突出显示。但这并不特别困难 与我们已经拥有的其他更困难的东西相比 与其他语言相比,用C ++做。
对于一些编译器编写者来说,这些轻微不便一周, 但对用户来说是无缝的。这是正确的权衡。除此以外, 拥有丑陋的全球保留名称(选项2)或不适当的 明显地用螺栓固定 - 关于属性(选项1)使一些编译器编写者在一周内更容易,但数百万用户将不得不忍受的事情 永远。
更改已通过N3206: Override control: Eliminating Attributes和N3272: Follow-up on override control应用于标准。