编译器要求覆盖和最终

时间:2011-09-24 10:27:35

标签: c++ compiler-construction override virtual c++11

我记得在讨论最终导致新的上下文关键字overridefinal的一般属性时,有人建议编译器支持这些某些可能是可选的(我想它会在标准文本中读作“行为是特定于实现的。”但我在FDIS中找不到关于此可选性的任何痕迹以及之后的更正。

但由于没有发现它不是证据,我不得不问:支持如FDI的2.11p2,9.2和10.3所描述的那样 override和{ {1}}对于符合标准的编译器是否必须?

例如,是否需要符合的编译器拒绝

final

或者它是否仍然符合忽略覆盖

2 个答案:

答案 0 :(得分:6)

是的,要求合规实施不会忽略override。首先,override只能出现在虚拟成员函数的声明中。

9.2 / 9:

  

[...] virt-specifier-seq只出现在虚拟成员函数的声明中。

其次,一个不覆盖基类成员函数但标记为override的虚函数会使程序格式不正确。

10.3 / 7:

  

如果使用virt-specifier override标记虚函数并且不覆盖基类的成员函数,则该程序格式错误。

由于两者都是标准的可诊断规则,因此符合标准的编译器忽略违规是违法的。 (1.4 / 1)

同样的推理适用于final,相关要求在9 [class] / 3和10.3 [class.virtual] / 4中。

答案 1 :(得分:5)

overridefinal use 对于程序员来说是可选的,但它没有说编译器可以忽略它们。

对于使用属性而非关键字的早期提案,这可能有所不同。属性为编译器留下了更多的自由。