[英]Can I apply the final keyword to a POD (standard-layout) struct in C++11 ? Should I?
[英]Can the 'final' keyword be made conditional to C++11 in an API?
在頭文件中有條件地將final
C ++ 11關鍵字有條件地啟用為標准版本是個好主意嗎? 我在想類似的東西:
#if __cplusplus >= 201103L
# define MY_FINAL final
#else
# define MY_FINAL
#endif
// ...
class Derived : public Base
{
public:
virtual int f() MY_FINAL;
};
我在這里有兩個疑問:
final
的方法是否將與ABI兼容(在我看來,這樣做是合理的,並且使用g++
進行的快速檢查確認了這一點), 1) final
應該永遠不會影響ABI,它只會影響從C ++源代碼進行的轉換是成功還是失敗,它對生成的代碼沒有必需的影響。
2)如果您准備使用一些非標准擴展名,則即使在C ++ 98模式下,您也可以使編譯器抱怨。 G ++ 4.7在C ++ 98模式下支持__final
,其含義相同:
#if __cplusplus >= 201103L
# define MY_FINAL final
#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
# define MY_FINAL __final
#else
# define MY_FINAL
#endif
我認為clang ++在C ++ 98模式下接受final
,但發出警告。
#
2很給定。 我對#1
不太確定。 從邏輯上講,例如,C ++ 11編譯器完全有權對派生對象進行f()
內聯調用,而不發出虛擬調用,而C ++ 03編譯器則被迫發出虛擬調用。 我不確定這是否會產生實際效果,但可能會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.