constへの参照として例外をキャッチするのはなぜですか?


84

例外を参照としてではなく、constへの参照としてキャッチする方がよいと何度も聞いたり読んだりしました。理由:

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

より良い:

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}

回答:


67

必要なもの:

  • 例外に多態的にアクセスできるようにするための参照
  • パフォーマンスを向上させるためのconst、およびオブジェクトを変更しないことをコンパイラーに通知します

後者は前者ほど重要ではありませんが、constを削除する唯一の本当の理由は、例外を変更することを通知することです(通常、コンテキストを追加してより高いレベルに再スローする場合にのみ役立ちます)。 。


1
「オブジェクトを変更しないことをコンパイラーに伝えてください」—オブジェクトをパラメーターとして関数呼び出しに渡す場合に役立つと思います。
Craig McQueen

1
「例外に多態的にアクセスする」とはどういう意味ですか?
マンゴー

3
@mangoは、おそらく仮想関数(std::exceptionwhat()関数など)を呼び出せることを意味します。値でキャッチした場合、その関数を呼び出して元の例外の詳細を取得することはできません。
MM

11
apple clang7とgcc5(最適化O3を使用)によって生成されたアセンブリを調べましたが、constrefアセンブリとnon-constrefアセンブリの間に違いは見られません。したがって、gccとapple clangの最適化に違いはないと思います
Vasiliy Soshnikov 2016年

2
コンパイラーは、変更したオブジェクトと変更しないオブジェクト(SSAと定数伝搬)を簡単に確認できます。より良い説明が必要です(またはそれは神話ですか?)。
rustyx 2017

31

基本的に理由は全くありません。

例外オブジェクトは独自のメモリ空間に存在するため、一時式で作成された例外をキャッチすることを心配する必要はありません。

あなたがしているのは、例外オブジェクトを変更しないことを約束することだけですが、例外オブジェクトは不変のインターフェースを持つ必要があるため、ここでは実際には何も実用的ではありません。

しかし、それを読むと、暖かく居心地の良い気分になるかもしれません—それが私にとっての方法です!

独自の特別なスレッドローカルスタックがあります。
免責事項: Boost.Exceptionは、ファンキーな処理を実行し、構築後に例外の詳細を追加するために、これを中断します。しかし、これはハッカーです!


詳しく教えていただけException objects live in their own memory spaceますか?あなたはそれについて提案するために良い読み物を持っていますか?
リチャードダリー2016年

@LeFlou:標準を指摘することはできますが、「良い読み物」と見なすのは少し誤解を招くでしょう...:P
軌道上の

確かにそうです、標準的な観点からこれについてもっと学ぶことは興味深いでしょう。C ++パフォーマンスに関するテクニカルレポートを読んでいますが、もっと関連性の高いドキュメントはありますか?
リチャードダリー2016年

@LeFlou:ええと、それは標準自体よりも権威がありません....
軌道上の

1
@RichardDallyチェックC ++入門5日、§18.1.1 Excpetionオブジェクトを。例外オブジェクトは、コンパイラーによって管理されるスペースに存在し、呼び出されたキャッチにアクセスできることが保証され
リック

5

これは、例外を変更する関数を呼び出さないことをコンパイラーに通知します。これは、コードの最適化に役立つ場合があります。おそらく大した違いはありませんが、それを行うためのコストも非常に小さいです。


2

例外を変更しますか?そうでない場合は、constである可能性があります。他の場所でconstを使用する必要があるのと同じ理由(表面的にはそれほど大きな違いはなく、コンパイラーに役立つ可能性があり、コーダーがコードを適切に使用し、すべきでないことを行わないようにするために、SHOULDと言います)

例外ハンドラーは、プラットフォーム固有である可能性があり、例外が変更されることを期待していないため、面白い場所に例外を配置する可能性がありますか?


-1

同じ理由で、constを使用します。


そして、ポインタよりも参照を好む理由と同じ理由で:-)
Dimitri C.

12
シンプルでグリブですが、実際には答えではありません。
オムニファリアス2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.