我记得在讨论最终导致新的上下文关键字override
和final
的一般属性时,有人建议编译器支持这些某些可能是可选的(我想它会在标准文本中读作“行为是特定于实现的。”但我在FDIS中找不到关于此可选性的任何痕迹以及之后的更正。
但由于没有发现它不是证据,我不得不问:支持如FDI的2.11p2,9.2和10.3所描述的那样 override
和{ {1}}对于符合标准的编译器是否必须?
例如,是否需要符合的编译器拒绝
final
或者它是否仍然符合忽略覆盖?
答案 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)
override
和final
的 use 对于程序员来说是可选的,但它没有说编译器可以忽略它们。
对于使用属性而非关键字的早期提案,这可能有所不同。属性为编译器留下了更多的自由。