nothrow (C++)

Microsoft 固有の仕様

関数の宣言に使用できる __declspec 拡張属性。

構文

return-type__declspec(nothrow) [call-convention] function-name ([argument-list])

解説

新しいコードでは、__declspec(nothrow) ではなく noexcept 演算子を使用することをお勧めします。

この属性は、宣言された関数、および、その呼び出す関数が例外をスローしないことをコンパイラに伝えます。 ただし、ディレクティブは適用されません。 つまり、noexcept や、std:c++17 モード (Visual Studio 2017 バージョン 15.5 以降)、throw() とは異なり、std::terminate が起動されることはありません。

同期例外処理モデル (現在は既定のモデル) の場合、コンパイラはこのような関数で特定のアンワインド可能オブジェクトの有効期間を追跡する機構を削除して、コード サイズを大幅に小さくできます。 次のプリプロセッサ ディレクティブを指定した場合、その下の 3 つの関数宣言は /std:c++14 モードで等価です。

#define WINAPI __declspec(nothrow) __stdcall

void WINAPI f1();
void __declspec(nothrow) __stdcall f2();
void __stdcall f3() throw();

/std:c++17 モードでは、throw() は、関数から例外が投げられると std::terminate が呼び出されるようになるため、__declspec(nothrow) を使用する他のものと同等ではありません。

void __stdcall f3() throw(); 番目の宣言は C++ 標準で定義されている構文を使用します。 C++17 では、throw() キーワードは非推奨となりました。

Microsoft 固有の仕様はここまで

関連項目

__declspec
noexcept
キーワード