4

多くのビデオを見たり、本を読んだりした後、いつ、いつ noexcept を使用しないかについてよくわかりません。

すべての本は、関数が決してスローしない場合にのみ noexcept を使用するべきだと言っています。

それ以外で使うべきだと思います。割り当てる関数は noexcept であってはならないと多くの人が言いますが、これらのエラーをキャッチしたくなくて、への呼び出しstd::terminateが許容される場合はどうすればよいでしょうか?

つまり、スローしない関数、または例外をキャッチしたい関数を除くすべての関数で noexcept を使用する必要があります。

IMHO 一部の例外はキャッチする必要はありません (つまり、メモリ不足など)

4

1 に答える 1

3

マーカーnoexceptは、関数が決してスローしないことを開発者からコンパイラーに保証するものです。

したがって、スローしてはならないことがわかっている関数に追加する必要があります。これらの関数が何らかのあいまいで認識できない理由でスローする場合、コンパイラーができる唯一のことはアプリケーションを終了することです (発生しないことが保証されているため)。注: noexcept とマークされた関数からは、noexcept とマークされていない限り、おそらく別の関数を呼び出すべきではありません (const の正当性と同様に、noexcept の正当性が必要です)。

どこで使用する必要がありますか:

  swap()   methods/functions. 
           Swap is supposed to be exception safe.
           Lots of code works on this assumption.

  Move Constructor
  Move Assignment.
           The object you are moving from should already be
           fully formed so moving it is usually a processes of
           swapping things around.

           Also be marking them noexcept there are certain 
           optimizations in the standard library that can be used.

     Note: This is usually the case.
           If you can not guarantee that move/swap semantics are 
           exception safe then do not mark the functions as noexcept.

すべての例外で terminate を呼び出す必要はありません。ほとんどの場合、例外がデストラクタを呼び出してリソースを正しく解放するスタックをアンワインドできるようにします。

キャッチされない場合、アプリケーションは終了します。

ただし、ほとんどの複雑なアプリケーションは、例外に対して回復力がある必要があります。開始されたタスクを破棄して例外をログに記録し、次のコマンドを待ちます。それでも終了したい場合がありますが、グラフィック アプリケーションでのスマッジ操作が失敗したからといって、アプリケーションを無残に終了させたいわけではありません。スマッジ操作を放棄してリソースを再利用し、アプリケーションを通常の操作に戻すことをお勧めします (終了を保存して再起動できるようにするため)。

于 2015-07-15T06:46:17.600 に答える