为什么"override"在 C++11 的末尾?
Why "override" is at the end in C++11?
我想看看为什么在 C++11 中,他们必须在方法的末尾添加 override
关键字,而不是像 virtual
那样在开头添加。我认为能够在方法的声明中同时编写virtual
和override
没有兴趣。
委员会没有选择简单地编写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
是一个上下文相关的关键字,这意味着您也可以将其用作标识符。这样做是为了避免破坏使用此标识符的现有代码。这意味着它必须出现在不允许标识符的位置,即紧跟在函数声明的右括号之后。
- 如何确保C++函数在定义之前声明(如override关键字)
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- 为什么"override"在 C++11 的末尾?
- Empty override C++11