実行時とコンパイル時にそれぞれチェックされることthrow()
とnoexcept
それ以外に違いはありますか?
このWikipedia C ++ 11の記事は、C ++ 03スロー指定子が非推奨であることを示唆しています。
なぜそうnoexcept
なのか、コンパイル時にそれらすべてをカバーするのに十分な能力があるのですか?
実行時とコンパイル時にそれぞれチェックされることthrow()
とnoexcept
それ以外に違いはありますか?
このWikipedia C ++ 11の記事は、C ++ 03スロー指定子が非推奨であることを示唆しています。
なぜそうnoexcept
なのか、コンパイル時にそれらすべてをカバーするのに十分な能力があるのですか?
回答:
例外指定子は一般的にひどい考えであるため、例外指定子は廃止されました。noexcept
これは、例外指定子の合理的に有用な用途の1つである、関数がいつ例外をスローしないかを知るために追加されました。したがって、それはバイナリの選択になります。スローする関数とスローしない関数です。
noexcept
より強力throw()
だからという理由以外に、単にすべてのスロー指定子を削除するのではなく、追加されましたnoexcept
。noexcept
コンパイル時にブール値に解決されるパラメーターを持つことができます。ブール値がtrueの場合、noexcept
スティックします。ブール値がfalseの場合、noexcept
は固定されず、関数がスローする可能性があります。
したがって、次のようなことができます。
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
いCreateOtherClass
投げる例外を?T
デフォルトのコンストラクタで可能な場合は、そうなる可能性があります。どうやってわかりますか?このような:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
したがって、CreateOtherClass()
指定された型のデフォルトのコンストラクターがスローする場合にのみスローされます。これにより、例外指定子に関する主要な問題の1つが修正されます。それは、コールスタックを上に伝搬できないことです。
でこれを行うことはできませんthrow()
。
noexcept
。私はthrow()
これまでに指定子を使用したことがなく、noexcept
実際にメリットがあるかどうかを確認しようとしています(コンパイラチェックドキュメント以外)。
std::terminate
。これはWAYより悪いです!コードは、機能がマークされたリリースに潜入しnoexcept
、実行時に(つまり、お客様のサイトで)違反が検出されます。そもそもコンパイラが例外をスローしないコードを生成することを保証することを意味しました。
throws()
、例外がスローされている場合、スタックは、必要があり、その時点で(関数内のすべての自動変数が破壊されるように)その機能の範囲件まで解かことterminate()
(VIAと呼ばれますunexpected()
)。関数にマークが付けられているnoexcept
場合、例外がスローされると、終了が呼び出されます(スタックの巻き戻しは実装定義の詳細です)。
noexcept
コンパイル時にチェックされません。
実装は、実行時に含まれている関数で許可されていない例外をスローまたはスローする可能性があるため、式を拒否しません。
宣言されている関数、noexcept
またはthrow()
例外をスローしようとするときの唯一の違いは、1つの呼び出しterminate
と他の呼び出しunexpected
、および後者の例外処理スタイルが事実上非推奨になっていることです。
throw()
/があるnoexcept
場合、コンパイル時のチェックで、オーバーライドが必ずあることを確認します。
noexcept
実行時チェックが発生する場合があります。その破壊され、それらの間の主な違いnoexcept
の原因をstd::terminate
破壊しながら、throw
原因をstd::unexpected
。また、これらの場合のわずかに異なるスタックの巻き戻し動作。