15

私はC++11で小さなプログラムを書いていて、実際に初めて例外を使用しています。

例外を効率的にキャッチする方法について質問がありますが、グーグルで調べても答えがわかりません。

ここに質問があります:(const?)左辺値参照または(const?)右辺値参照によって例外をキャッチすることの間でより効率的な(または推奨される)ものは何ですか?

コードでこれは与える:

1)

try { throw std::exception{"what"}; }
catch (std::exception& ex) {}

2)

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}

3)

try { throw std::exception{"what"}; }
catch (std::exception&& ex) {}

4)

try { throw std::exception{"what"}; }
catch (const std::exception&& ex) {}
4

2 に答える 2

32

const lvalue参照(2)でキャッチする必要があります。

try { throw std::exception{"what"}; }
catch (const std::exception& ex) {}

理論的根拠:

C ++ 11では、(を使用してshared_future)2つのスレッドが同時に同じ例外を巻き戻す可能性があります。shared_futureこれは、アプリケーション全体を制御しない限り、使用されていることに気付いていなくても、コードで発生する可能性があります。

2つのスレッドが同じ例外の巻き戻しを同時にキャッチし、一方または両方のスレッドが例外を変更した場合、競合状態になります。

catch句の例外オブジェクトを変更する必要がない限り、コンパイラにそのポリシーを適用させます-catchby const&。本当に例外を変更する必要がある場合は、例外のコピーを作成し、コピーを変更して、コピーをスローします。これが例外オブジェクトをスライスしないことが確実な場合は、値でキャッチすることでこれを行うことができます(これは、キャッチしている場合は通常は当てはまりませんstd::exception)。

于 2011-09-28T13:38:27.663 に答える
1

例外は通常の方法で左辺値参照によってキャッチされるべきだと思います。これが右辺値の良い説明です-参照の使用

于 2011-09-28T10:24:33.033 に答える