noexcept (C++)

C++11: 関数が例外をスローするかどうかを指定します。

構文

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

パラメーター

constant-expression
潜在的な例外の種類のセットが空かどうかを表す型 bool の定数式。 無条件のバージョンは noexcept(true) と同じです。

解説

noexcept-expression は、"例外指定" の一種です。これは、関数を終了する例外に対して例外ハンドラーによって一致する可能性がある一連の型を表す関数宣言のサフィックスです。 単項演算子 noexcept(constant_expression) ここで constant_expressiontrue を生成し、その無条件シノニム noexcept は、関数を終了できる潜在的な例外の種類のセットが空であることを指定します。 つまり、この関数は例外をスローせず、例外をスコープ外に反映できません。 演算子 noexcept(constant_expression) ここで constant_expressionfalse を生成します。または、例外指定がない場合 (デストラクターまたは割り当て解除関数以外)、関数を終了できる潜在的な例外のセットが、すべての型のセットであることを示します。

(直接または間接的に) 呼び出すすべての関数も noexcept または const の場合のみ関数を noexcept とマークします。 コンパイラは noexcept 関数に浮上する可能性がある例外のすべてのコード パスを必ずしもチェックするわけではありません。 例外が noexcept とマークされた関数の外部スコープを終了した場合には、std::terminate がすぐに起動され、スコープ内のオブジェクトのデストラクターが起動される保証はありません。 動的例外指定子 throw() の代わりに noexcept を使用します。 動的例外指定 (または throw(optional_type_list) 指定) は C++11 では非推奨になり、throw() (noexcept(true) のエイリアス) を除いて C++17 では削除されました。 例外を呼び出し履歴に反映しない関数に noexcept を適用することをお勧めします。 関数が noexcept と宣言された場合、その関数を使用すると、コンパイラはいくつかの異なるコンテキストでより効率的なコードを生成できるようになります。 詳細については、「例外の指定」をご覧ください。

引数をコピーする関数テンプレートは、コピーされる noexcept オブジェクトが単純な古いデータ型 (POD) であることを条件に宣言できます。 このような関数は、次のように宣言することができます。

#include <type_traits>

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

関連項目

例外とエラー処理に関する最新の C++ のベスト プラクティス
例外の指定 (thrownoexcept)