簡體   English   中英

API中的'final'關鍵字能否以C ++ 11為條件嗎?

[英]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;
};  

我在這里有兩個疑問:

  1. 具有和不具有final的方法是否將與ABI兼容(在我看來,這樣做是合理的,並且使用g++進行的快速檢查確認了這一點),
  2. 當有人嘗試覆蓋該方法時,C ++ 98編譯器不會抱怨。 但是我認為,記錄該方法不要覆蓋它應該可以解決此問題。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM