2012-04-23 7 views
4

可能性の重複:
C++11 Feature CheckingGCCのバージョン間で利用可能なC++ 11の機能を正しく検出するにはどうすればよいですか?

私はGCC 4.7の導入でC++ 11標準ライブラリを散らかされているように見えるnoexcept仕様の場合には特に興味があります。この場合、コンパイラのバージョンを検出するだけで十分です。それは移植可能なコードを生成するための最良のメカニズムですか?

#include <system_error> 

class server_error_category : public std::error_category 
{ 
    public: 
    virtual const char* name() const { ... } 
    // 
    // fails beginning with gcc4.7, 
    // looser throw specifier ... 
    // overriding 'virtual const char* std::error_category::name() const noexcept (true) 

    ... 
}; 
+5

[Boost.Config](のhttp:// www.boost.org/libs/config/)は 'noexcept'仕様をサポートしていないコンパイラのマクロBOOST_NO_NOEXCEPTを定義します。 GCC以外のコンパイラでの移植性が懸念される場合は、Boostにあなたに苦労してもらうことをおすすめします。 – ildjarn

+0

@ildjam Gar、それほど最近のことではない! –

+0

'#if defined(__ has_feature)&& __has_feature(cxx_noexcept)'を実行すると、それを実装していないコンパイラでnoexceptを使用しないことが保証されます。一方、機能検査マクロをサポートしていないため、サポートしていないコンパイラでnoexceptを利用することはできません...(AFAIK __has_featureはClangでのみ動作します) – bames53

答えて

2

あなただけnoexceptが(代わりに前処理時の)コンパイル時に特定の方法に適用されるかどうかを確認したい場合は、単にnoexcept演算子を使用することができます。

​​

、その後、あなたはライブラリが時間を前処理されたnoexceptサポートしているかどうか確認することはできません構文

virtual const char* name() const 
    noexcept(noexcept(std::declval<std::error_category>().name())) 
{ ... } 

を使用してnoexcept条件付きメソッドを作ることができます。バージョンチェックは唯一の方法です。

しかし、とにかくnoexceptを投げることができます。サブクラスのオーバーライドは、基本クラスがそうでなくてもnoexceptであることが有効です。

virtual const char* name() const noexcept { ... } 
// valid even in 4.6. 

は(noexceptは言語における4.6以降サポートされていますが、ライブラリの使用量が4.7に表示されているためBoost.Configは本当に助けにはならないことに注意してください。)

関連する問題