2

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;
};  

ここで 2 つの疑問があります。

  1. ある方法とない方法finalがABI互換であるかどうか(私にはそう仮定するのが合理的であり、簡単なチェックでそれがg++確認されます)、
  2. 誰かがメソッドをオーバーライドしようとしても、C++98 コンパイラは文句を言いません。しかし、メソッドをオーバーライドしないように文書化することで、これを処理できると思います。
4

2 に答える 2

3

1) finalABI には影響しません。C++ ソース コードからの変換が成功するか失敗するかにのみ影響し、生成されたコードには影響しません。

2) いくつかの非標準の拡張機能を使用する準備ができている場合、C++98 モードでもコンパイラーに文句を言わせることができます。G++ 4.7 は__final、同じ意味で C++98 モードをサポートします。

#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が、警告を発行します。

于 2012-08-13T20:33:16.967 に答える
1

#2はかなり与えられています。しかし、私はよくわかりません#1。論理的には、C++11 コンパイラは派生オブジェクトに対する呼び出しをインライン化する権利を十分に持っておりf()、たとえば、仮想呼び出しを発行しませんが、C++03 コンパイラは仮想呼び出しを発行する必要があります。これが実際に違いを生むかどうかはわかりませんが、そうかもしれません。

于 2012-08-12T22:42:54.370 に答える