関数をnoexcept(false)
、または false と評価されるその他の式としてマークした場合、それはどういう意味ですか? (1) 関数が例外をスローできることをコンパイラーに保証していますか? (2) または、関数が例外をスローできるかどうかについて何も保証していませんか?
noexcept
最後に、指定子を省略した場合、それは と同等noexcept(false)
か、それとも上記の (2) の意味のみと同等か?
を指定することによりnoexcept(true)
、関数が決して例外をスローしないと主張します。を指定noexcept(false)
するか、何も指定しないことで、関数が例外をスローしないと主張しません。
したがって、これは基本的にあなたのステートメント (2) ですが、コンパイラにとっては、ステートメント (1) と同等であることに注意してください。関数がスローしないことが保証されていない場合、コンパイラはスローできると想定する必要があります。
標準の関連ビットは C++11 15.4/12 です。
例外仕様のない関数、または定数式が生成する形式の例外仕様を持つ関数は、すべての例外を許可します。、、または定数式 が yieldの形式である場合、例外仕様は 非スローです。非スローの例外仕様を持つ関数は、例外を許可しません。
noexcept(constant-expression)
false
throw()
noexcept
noexcept(constant-expression)
true
その規則からの逸脱は 2 つだけです。1 つはデストラクタです。デストラクタに例外仕様を設定しないと、デフォルトで生成されたものと同じ例外仕様がデストラクタに与えられます。つまりnoexcept(true)
、デフォルトで生成されたデストラクタから直接呼び出されるすべての関数がnoexcept(true)
.
もう 1 つは割り当て解除関数 ( operator delete
) です。明示的な例外指定のない割り当て解除関数は として扱われnoexcept(true)
ます。
指定子を省略することは、デストラクタを除いてnoexcept
と同等です。指定子を省略すると、コンパイラがメンバーと基底クラスから推測できるようになります。noexcept(false)