11

C++ 関数から可能な例外スローを宣言する利点は何ですか? 言い換えれば、キーワードを追加するとthrow()実際に何ができるのでしょうか?

void do_something() throw();のような関数宣言は、関数から例外が発生しないことを保証する必要があることを読みましたdo_something()。ただし、これは 内で呼び出される関数には当てはまらないようdo_something()で、弱い保証になります。

この言語機能の有用性 (および最適な使用例) について概説してください。

4

4 に答える 4

21

サッター以上にこれを説明できる人はいない

http://www.ddj.com/architect/184401544

ショートバージョンは

  1. 例外仕様を書かない
  2. おそらく空のものを除いて
于 2009-03-04T05:40:45.050 に答える
5

C++ 標準では、unexpected()関数が例外リストにない例外をスローしようとした場合に関数を呼び出す必要があります。これに関する MSDN の簡単な説明は次のとおりです: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

ほとんどのコンパイラは、実際にはこの C++ 機能をサポートしていません。

于 2009-03-04T05:35:51.210 に答える
1
void do_something() throw(); 

これは、関数が決して例外をスローしないという実装者側からの保証です。これは、関数のクライアントが期待できることです。ただし、関数内のどこかで生成された例外が処理され、 の親に再スローされないことも意味しますdo_something()。彼が投げるthrowのを止めるものは何もないからです。これは、例外仕様が空の関数内からスローすることは、仕様に記載されていない例外をスローすることと同等であり、std::unexpected()その後にプログラムの終了が予想されるためです。

ところで: 一般的に受け入れられている強力な例外保証の定義は次のとおりです。パブリック操作が何らかの理由で失敗した場合、例外がスローされ、オブジェクトの状態は変更されません (アトミック操作)。

于 2009-03-04T05:38:00.113 に答える
0

基本的に、関数を宣言することにより、関数が例外をスローしないことを100% 確信throw();していることをコンパイラーに伝え、コンパイラーがいくつかの最適化を実行できるようにします。とにかく関数が例外をスローする場合は、未定義の動作が発生する可能性が高いため、問題が発生します。

于 2009-03-04T05:33:17.877 に答える