2011-09-24 126 views
4

我還記得,大約一般屬性的討論並最終導致新的上下文關鍵字overridefinal期間有人提出,這些礦石編譯器支持一些是可選的(我想這將在標準文本中閱讀爲「行爲是特定於實現的」)但我無法在FDIS中找到任何有關此選項的跟蹤以及之後的更正編譯器的要求,最終

但是由於沒有找到證明,所以我不得不問: 是FDIS 的2.11p2,9.2和10.3中描述的支持對於overridefinal符合編譯器的義務嗎?

難道例如要求一個符合標準的編譯拒絕

class Foo { 
    void func() override; // Error: not virtual, 9.2p9 
}; 

或者是它仍然無視覆蓋符合?

回答

6

是的,要求override不被符合的實現忽略。首先,override只能出現在虛擬成員函數的聲明中。

9.2/9:

[...]甲的virt說明符-SEQ應僅在虛擬成員函數的聲明出現。

其次,不覆蓋基類的成員函數但標記爲override的虛函數使得程序不合格。

10.3/7:

如果虛擬函數標有VIRT說明符倍率和不覆蓋的基類的成員函數,是形成不良的節目。

由於兩者都是標準的可診斷規則,所以符合標準的編譯器忽略違規是非法的。 (1.4/1)

相同的推理適用於final,相關要求在9 [class]/3和10.3 [class.virtual]/4中。

5

使用overridefinal是可選的程序員,但無處它說,編譯器可以忽略它們。

對於之前使用屬性而不是關鍵字的提案,這可能會有所不同。屬性給編譯器留下了更多的自由。

+0

「程序員可選」...很好地把:-) – towi