支持重新使用短关键字(并添加依赖于上下文的含义)而不仅仅是添加更多关键字的主要论点是什么?
是否只是想要避免破坏可能已经使用建议的新关键字的现有代码,还是有更深层次的原因?
C++ 11中新的"枚举类"让我想到了这一点,但这是一个通用的语言设计问题.
我试图看到为什么在C++ 11中,他们必须override在方法的末尾而不是像开头那样添加关键字virtual.我不明白的是能够写出两种利益virtual,并override在方法的声明.
有没有技术上的原因,为什么委员会不选择简单地写作override而不是virtual在需要时?
谢谢!
在gcc中禁用检查覆盖的问题的答案建议-Doverride=在命令行上使用以禁用错误使用覆盖的错误,这实际上与添加:
#define override
Run Code Online (Sandbox Code Playgroud)
到源文件.
我最初的反应是,这似乎是未定义的行为,因为我们正在重新定义关键字但是查看草案C++ 11标准部分2.12 关键字[lex.key]我很惊讶,无论是覆盖还是最终都不是关键字.它们在上一节2.11 [lex.name]中有所介绍,它说它们是具有特殊含义的标识符:
表3中的标识符在特定情况下出现时具有特殊含义[...]
和表3中被标记为具有特殊的含义标识符,并且包括覆盖和最后.
问题是,重新定义(使用#define)具有特殊含义的标识符是不确定的行为?在这方面,他们的待遇是否与关键词不同?
以下是声明nullptr_t中<cstddef>:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)
根据这个,std::nullptr_t是一个未指定的基本类型的别名nullptr是一个实例.所以实际的类型nullptr没有名称(好吧,语言不给它起名,名称由标准库给出).
nullptr本身就是一个关键字.但标准没有为类型引入关键字nullptr.而是使用decltype(nullptr)提供.
这样做的原因是什么?我觉得很困惑.您需要包含标头并指定std::仅使用语言内置功能.
这是为了保持C++关键字的集合尽可能小吗?这是专门为nullptr委员会或委员会宣布这样的所有新类型,所以namespace std { typedef decltype(false) bool; }如果早些时候作出这样的决定我们会有吗?
我一直想知道决定,为什么override和final必须在成员函数声明符之后:
struct Base {
virtual void virtFun();
};
struct Foo: Base {
virtual void virtFun() override;
};
Run Code Online (Sandbox Code Playgroud)
对我来说,放置override/ final代替以下内容更合乎逻辑virtual:
struct Base {
virtual void virtFun();
};
struct Foo: Base {
override void virtFun();
};
Run Code Online (Sandbox Code Playgroud)
这背后有原因吗?也许与C++ 11之前有一些兼容性问题?