为什么C ++ 11会覆盖而最终不是属性?

时间:2017-01-13 15:04:48

标签: c++ c++11

我不知道在C ++ 11中引入了属性。现在我发现了,我想知道为什么overridefinal被添加为具有特殊含义的标识符而不是标准属性。

override的目的是生成编译时错误,这也是许多标准属性的目的。感觉好像他们符合这个概念,但我可能有理由错过这个概念。

2 个答案:

答案 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*); 
};
     

此处我们有六个关键字(不包括voidchar):三个正常   关键字和三个[[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()等。

这清楚地表明标准语言关键字不是属性。