実行時とコンパイル時にそれぞれチェックされること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。また、これらの場合のわずかに異なるスタックの巻き戻し動作。