次の方法で共有


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場合に、関数を終了できる可能性のある例外型のセットが空であることを指定します。 つまり、関数は例外をスローしません。また、例外がスコープ外に伝達されることは決して許可されません。 constant_expressionfalseを生成する場合、または例外指定がない場合 (デストラクターまたは割り当て解除関数を除く) にnoexcept(constant_expression)演算子は、関数を終了できる可能性のある例外のセットが、すべての型のセットであることを示します。

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

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

#include <type_traits>

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

こちらも参照ください

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