为什么"override"在 C++11 的末尾?

Why "override" is at the end in C++11?

本文关键字:C++11 override 为什么      更新时间:2023-10-16

我想看看为什么在 C++11 中,他们必须在方法的末尾添加 override 关键字,而不是像 virtual 那样在开头添加。我认为能够在方法的声明中同时编写virtualoverride没有兴趣。

委员会没有选择简单地编写override而不是在需要时virtual,这是否有技术原因?

谢谢!

关于添加关键字控制覆盖(override/final)的建议,论文N3151,给了我们一些关于这个选择的见解(强调我的):

最好将此类虚拟控件关键字放在 声明,这样它们就不会与例如冲突。返回类型 声明的开头。

[...]

对于不区分上下文的普通关键字,在以下位置不太重要 放置关键字是因为保留了单词。我们可以把 它们在声明的开头或结尾。

在讨论属性时,弗朗西斯·格拉斯博罗指出 宣言的开始变得拥挤。如果我们把 一开始的虚拟控件关键字,我们可以以示例结束 像下面这样:

struct B
{
   virtual volatile const unsigned long int f()
      volatile const noexcept;
   void f(int g);
};
struct D : B
{
   virtual hides_name virtual_override final_overrider volatile const unsigned long int f()
      volatile const noexcept;
};

将新关键字放在末尾至少可以缓解这种情况 有点:

struct B
{
   virtual volatile const unsigned long int f()
      volatile const noexcept;
   void f(int g);
};
struct D : B
{
   virtual volatile const unsigned long int f()
      hides_name virtual_override final_overrider volatile const noexcept;
};

有些人认为这些控制关键字应该在 与虚拟相同的地方。如前所述,那个地方已经很拥挤了。


注意:

C++ 11标准在§ 2.11/2 [lex.name]节中定义了上下文相关的关键字:

表 3 中的标识符在出现在 一定的背景。在语法中引用时,这些标识符 显式使用而不是使用标识符语法 生产。除非另有说明,否则对是否 给定标识符具有特殊含义,解析解释 令牌作为常规标识符。

表3:

最终覆盖

这当然是有技术原因的!您可以在本文中阅读有关它的所有内容。

简而言之,override是一个上下文相关的关键字,这意味着您也可以将其用作标识符。这样做是为了避免破坏使用此标识符的现有代码。这意味着它必须出现在不允许标识符的位置,即紧跟在函数声明的右括号之后。