4

重複の可能性:
C++11 機能のチェック

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

#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)

    ...
};
4

1 に答える 1

2

noexcept(前処理時ではなく)コンパイル時に特定のメソッドに適用されているかどうかを確認したいだけの場合は、単純にnoexcept演算子を使用できます。

noexcept(std::declval<std::error_category>().name())
// return 'true' if the expression is '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.

(Boost.Configはnoexcept、言語で4.6以降サポートされているため、実際には役に立ちませんが、ライブラリの使用法は4.7で表示されることに注意してください。)

于 2012-04-23T19:07:41.870 に答える