106

実行時とコンパイル時にそれぞれチェックされる以外に違いはありますthrow()か?noexcept

このウィキペディアの C++11 の記事では、C++03 のスロー指定子が非推奨であることを示唆しています。
なぜ、noexceptコンパイル時にすべてをカバーするのに十分なのですか?

[注:この質問この記事を確認しましたが、非推奨の明確な理由を特定できませんでした。]

4

3 に答える 3

139

例外指定子は一般にひどい考えであるため、例外指定子は非推奨になりました。関数がいつ例外をスローしないnoexceptかを知るという、例外指定子の合理的に有用な使用法であるため、追加されました。したがって、スローする関数とスローしない関数の二者択一になります。

noexceptより強力なthrow()理由以外のすべてのスロー指定子を削除するのではなく、追加されました。コンパイル時にブール値に解決されるパラメーターを持つことができます。ブール値が true の場合、スティックします。ブール値が false の場合、は固執せず、関数がスローされる可能性があります。noexceptnoexceptnoexceptnoexcept

したがって、次のようなことができます。

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()

于 2012-10-11T06:23:36.820 に答える
34

noexceptコンパイル時にチェックされません。

実装は、式が実行されたときに含まれる関数が許可しない例外をスローするか、スローする可能性があるという理由だけで、式を拒否してはなりません。

宣言された関数noexceptまたはthrow()例外をスローしようとする関数の唯一の違いは、一方が呼び出さterminateれ、他方が呼び出さunexpectedれ、後者のスタイルの例外処理が事実上非推奨になったことです。

于 2012-10-11T06:23:58.723 に答える