nothrow (C++)nothrow (C++)

Microsoft 固有の仕様Microsoft Specific

A _ _declspec関数の宣言で使用できる拡張属性。A __declspec extended attribute which can be used in the declaration of functions.


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


すべての新しいコードを使用していることをお勧めします。、 noexcept演算子なく__declspec(nothrow)します。We recommend that all new code use the noexcept operator rather than __declspec(nothrow).

この属性は、宣言された関数、および、その呼び出す関数が例外をスローしないことをコンパイラに伝えます。This attribute tells the compiler that the declared function and the functions it calls never throw an exception. ただし、このディレクティブは適用されません。However, it does not enforce the directive. しないと、つまり、 std::terminate呼び出されるとは異なりnoexcept、または /std:c++17モード (Visual Studio 2017 バージョン 15.5 以降)、throw()します。In other words, it never causes std::terminate to be invoked, unlike noexcept, or in std:c++17 mode (Visual Studio 2017 version 15.5 and later), throw().

同期例外処理モデル (現在は既定のモデル) の場合、コンパイラはこのような関数で特定のアンワインド可能オブジェクトの有効期間を追跡する機構を削除して、コード サイズを大幅に小さくできます。With the synchronous exception handling model, now the default, the compiler can eliminate the mechanics of tracking the lifetime of certain unwindable objects in such a function, and significantly reduce the code size. 次のプリプロセッサ ディレクティブを指定するには、次の 3 つの関数の宣言が同じ /std:c++14モード。Given the following preprocessor directive, the three function declarations below are equivalent in /std:c++14 mode:

#define WINAPI __declspec(nothrow) __stdcall

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

/std:c++17モード、throw()を使用すると、他と等価でない__declspec(nothrow)原因になるのでstd::terminate関数から例外がスローされた場合に呼び出されます。In /std:c++17 mode, throw() is not equivalent to the others that use __declspec(nothrow) because it causes std::terminate to be invoked if an exception is thrown from the function.

void __stdcall f3() throw();宣言は、C++ 標準で定義されている構文を使用します。The void __stdcall f3() throw(); declaration uses the syntax defined by the C++ standard. C++ 17 で、throw()キーワードは非推奨とされました。In C++17 the throw() keyword was deprecated.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also