1. ホーム
  2. c++

[解決済み] C++03のthrow()指定とC++11のnoexceptの違い

2022-11-25 03:54:01

疑問点

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

この Wikipedia C++11 の記事 は、C++03 の throw 指定子が非推奨であることを示唆しています。

なぜそうなのか、それは noexcept はコンパイル時にすべてをカバーするのに十分な能力があるのでしょうか?

[注意: 私は この質問 この記事 などがありますが、非推奨の確かな理由はわかりませんでした]。

どのように解決するのですか?

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

noexcept 以外の throw 指定子をすべて削除するのではなく、 というのも throw() の方が強力だからです。 noexcept はコンパイル時にブール値に解決されるパラメータを持つことができます。もしこのブール値が真であれば noexcept が突き刺さる。もし真偽値が偽であれば noexcept は固まらず、関数は投げるかもしれません。

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

noexcept

struct<typename T> { void CreateOtherClass() { T t{}; } }; は例外を投げるのでしょうか?そうかもしれません、もし CreateOtherClass のデフォルトコンストラクタがそうであるなら、そうなるかもしれません。どうやって判断するのでしょう?こんな感じ。

T

このように struct<typename T> { void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; } }; は、与えられた型のデフォルトコンストラクタが throw した場合に throw します。これは、例外指定子の大きな問題の 1 つである、呼び出しスタックを上へ伝搬できないことを修正するものです。

これは CreateOtherClass() .