我不知道错过了C++ 11中引入的属性.现在我发现了,我想知道为什么override
并且final
被添加为具有特殊含义的标识符而不是标准属性.
目的override
是生成编译时错误,这也是许多标准属性的目的.感觉好像他们会适应这个概念,但我可能有理由错过这个概念.
在他们改变之前,他们曾经回应过关于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]]
虚拟覆盖控制的关键字,这是一个丑陋的新奇事物,没有现场经验,开发人员已经嘲笑过.