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

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

構文Syntax

noexcept-式:     noexcept     noexcept ( 定数式 )noexcept-expression:     noexcept     noexcept( constant-expression )

パラメーターParameters

定数式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).

コメントRemarks

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. 単項条件演算子は、 constant_expressiontrueを生成し、無条件シノニムnoexceptで、関数を終了する可能性のある例外の種類のセットが空であることを指定する 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. 演算子は、 constant_expressionfalseを返すか、または (デストラクターまたは解放関数以外の) 例外の指定がない場合に、関数を終了できる可能性のある例外のセットがすべての型のセットであることを示す) constant_expression noexcept(ます。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.

Example

引数をコピーするテンプレート関数は、コピーされるオブジェクトが 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++とエラー処理に関する最新のベストプラクティスModern C++ best practices for exceptions and error handling
例外の指定 (throw、noexcept)Exception Specifications (throw, noexcept)