4

何もスローしないメンバー関数があるので、その末尾にthrow()サフィックスを追加して、例外がスローされないことを示しています。

私の質問は、関数でいくつかを使用std::stringし、の初期化で何かがうまくいかないと言うことができます、そしてそれはまたは(またはstd :: stringでうまくいかない可能性があるもの)std::stringをスローします。bad_allocout_of_range

接尾辞を追加しても安全throw()ですか?

4

3 に答える 3

4

ハーブサッターそれを言います

例外仕様は、価値があるよりもはるかに少ない利益をもたらします

それは利益をもたらすよりも多くの問題を引き起こす可能性があります。したがって、それを行う前に賢明に考える必要があります。

于 2012-04-21T17:38:30.197 に答える
2

例外仕様は、関数を記述したかどうかに関係なく、関数内で実行されるすべてのコードについて約束します。

関数std::string内からスローすると、その約束は破られ、プログラムは失敗します。(std::unexpected例外、通常はプログラムがハードに終了することを意味します)

仕様は、次のthrow()場合にのみ適切です。

  • 間接的にさえ、あなたの関数が投げることができるものは何もありません

また

  • 関数はそのような例外をすべてキャッチし、正常に終了します(再スローなし)。
于 2012-04-21T17:33:53.973 に答える
2

2つのこと。

まず、throw()仕様は、関数がスローしないランタイムチェックを追加しstd::unexpected_exception、promiseが破られた場合に呼び出して、プログラムを終了します。

2番目:throw()推奨されておらず、C++11では非推奨になっています。noexceptC ++ 11では、代わりに(またはより順応性のある形式)を使用できますnoexcept(boolean-expression)。ランタイムチェックは作成されず、関数がスローされた場合の動作は未定義です。

于 2012-04-21T17:37:09.557 に答える