我不知道在C ++ 11中引入了属性。现在我发现了,我想知道为什么override
和final
被添加为具有特殊含义的标识符而不是标准属性。
override
的目的是生成编译时错误,这也是许多标准属性的目的。感觉好像他们符合这个概念,但我可能有理由错过这个概念。
答案 0 :(得分:7)
他们曾经,在他们因C ++ 11的FCD评论US 44而改变之前:
即使属性继续标准化,也要继续 被引用为委托人的两家供应商的反对意见 在现有技术中,除了虚拟之外,我们可以和它们一起生活 覆盖控件。这个结果很糟糕,如图所示 7.6.5中的例子(摘录):
class D [[base_check]] : public B { void some_func [[override]] (); virtual void h [[hiding]] (char*); };
此处我们有六个关键字(不包括
void
和char
):三个正常 关键字和三个[[decorated]]
关键字。已经有了 公开嘲笑C ++ 0x关于这个丑陋。这只是一个穷人 语言设计,即使面对向后兼容性问题 (例如,某些现有代码可能已经将这些单词用作 标识符)因为这些问题已经解决了 现有实践中的其他方式(见下文)。更重要的是,这是 正是滥用属性作为伪装的关键词 反对,并明确承诺不会发生,以获得 这个提案通过了。使用虚拟控件的属性 关键字是属性语法中最令人震惊的滥用,并且在 至少必须通过替换它们来修复属性的使用 非属性语法。这些虚拟覆盖控件是语言 功能,而不是注释。可能有好听的名字,没有 通过使用上下文关键字与现有代码冲突,例如 认识到这个词在出现时具有特殊含义 没有用户标识符的语法位置,如 在C ++ / CLI中展示了五年的实际领域 与大量客户的经验(而且没有名字 在该领域报道的冲突或程序员混淆问题 这已经有五年了):
class D : public B { void some_func() override; // same meaning as [[override]] - explicit override virtual void h (char*) new; // same meaning as [[hiding]] - a new function, not an override }; int override = 42; // ok, override is not a reserved keyword
以上表格可实施,已实施,有多年 实践经验和工作。开发人员喜欢它们。是否 答案是遵循现有的做法或其他方式, 目前需要更自然的替代品 用于虚拟覆盖控制的
[[attributed]]
个关键字很难看 没有现场经验且开发人员已经拥有的新奇事物 嘲笑。
答案 1 :(得分:0)
简单引用http://en.cppreference.com/w/cpp/language/attributes:
属性为实现定义的语言扩展提供统一的标准语法,例如GNU和IBM语言扩展属性((...)),Microsoft扩展__declspec()等。
这清楚地表明标准语言关键字不是属性。