noexcept (C++)noexcept (C++)

C++ 11: 関数が例外をスローするかどうかを指定します。C++11: Specifies whether a function might throw exceptions.


noexcept-expression:     noexcept     noexcept( constant-expression )noexcept-expression:     noexcept     noexcept( constant-expression )


潜在的な例外の種類のセットが空かどうかを表すブール型の定数式。A constant expression of type bool that represents whether the set of potential exception types is empty. 無条件バージョンは、と同じnoexcept(true)です。The unconditional version is equivalent to noexcept(true).


Noexcept 式は、例外指定の一種であり、関数を終了する例外の例外ハンドラーによって照合される可能性のある型のセットを表す関数宣言のサフィックスです。A noexcept expression is a kind of exception specification, a suffix to a function declaration that represents a set of types that might be matched by an exception handler for any exception that exits a function. noexcept( Constant_expressiontrue、無条件シノニムnoexceptの単項条件演算子constant_expression )は、一連の潜在的な例外の種類を指定します。関数を終了できますが空です。Unary conditional operator noexcept(constant_expression) where constant_expression yields true, and its unconditional synonym noexcept, specify that the set of potential exception types that can exit a function is empty. つまり、関数は例外をスローしないため、例外をスコープ外に反映することはできません。That is, the function never throws an exception and never allows an exception to be propagated outside its scope. 演算子noexcept( constant_expression where constant_expression は false を生成します。または、(デストラクターまたは解放関数以外の) 例外の指定がない場合は、)関数を終了できる可能性のある例外のセットは、すべての型のセットです。The operator noexcept(constant_expression) where constant_expression yields false, or the absence of an exception specification (other than for a destructor or deallocation function), indicates that the set of potential exceptions that can exit the function is the set of all types.

関数をnoexceptとしてマークします。この関数は、直接または間接的に呼び出したすべての関数がnoexceptまたはconstでもある場合に限ります。Mark a function as noexcept only if all the functions that it calls, either directly or indirectly, are also noexcept or const. コンパイラは、 noexcept関数にバブルアップする可能性のある例外のすべてのコードパスを必ずチェックするわけではありません。The compiler does not necessarily check every code path for exceptions that might bubble up to a noexcept function. 例外によってマークnoexceptされた関数の外側のスコープが終了した場合、 std:: terminateがすぐに呼び出され、スコープ内のオブジェクトのデストラクターが呼び出される保証はありません。If an exception does exit the outer scope of a function marked noexcept, std::terminate is invoked immediately, and there is no guarantee that destructors of any in-scope objects will be invoked. 動的例外指定子throw()ではなく、 noexceptを使用します。これは標準で非推奨とされます。Use noexcept instead of the dynamic exception specifier throw(), which is now deprecated in the standard. 例外がコールスタックnoexceptの上位に伝達されることを許可しないすべての関数に適用することをお勧めします。We recommended you apply noexcept to any function that never allows an exception to propagate up the call stack. 関数がnoexceptとして宣言されている場合、コンパイラは複数の異なるコンテキストでより効率的なコードを生成できます。When a function is declared noexcept, it enables the compiler to generate more efficient code in several different contexts. 詳細については、「例外の指定」を参照してください。For more information, see Exception specifications.


引数をコピーするテンプレート関数は、コピーされるオブジェクトが plain old data type (POD) であるという条件に対して、 noexceptとして宣言される場合があります。A template function that copies its argument might be declared noexcept on the condition that the object being copied is a plain old data type (POD). このような関数は、次のように宣言することができます。Such a function could be declared like this:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
   // ...

関連項目See also

C++ 例外処理C++ Exception Handling
例外の指定 (throw、noexcept)Exception Specifications (throw, noexcept)