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_expression
は true
を生成し、その無条件シノニム noexcept
は、関数を終了できる潜在的な例外の種類のセットが空であることを指定します。 つまり、この関数は例外をスローせず、例外をスコープ外に反映できません。 演算子 noexcept(constant_expression)
ここで constant_expression
は false
を生成します。または、例外指定がない場合 (デストラクターまたは割り当て解除関数以外)、関数を終了できる潜在的な例外のセットが、すべての型のセットであることを示します。
(直接または間接的に) 呼び出すすべての関数も 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>)
{
// ...
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示