2012-01-19 10 views
7

次のコードを実行します。constとして例外をスローする&

void DoThrow(const std::exception& e) 
{ 
    throw e; 
} 

int main(int nArgs, char* args[]) 
{ 
    std::exception e; 
    try 
    { 
     DoThrow(e); 
    } 
    catch(std::exception& e) 
    { 
     // const exception ref is caught 
    } 


    return 0; 
} 

私は自分のプロジェクトでconstの正しさを改造しようとしていて、不注意に上記の状況を作り出しました。デベロッパースタジオでは、キャッチブロックは例外&としてスローされますが、非const &としてキャッチされますが、例外をキャッチします。

質問 - すべきでしょうか? :-)

答えて

9

throw発現をとり、コピーの初期化を介してその発現の静的タイプに基づいて、例外オブジェクトを作成します。例外オブジェクトはconstオブジェクトではありません。

catchステートメントは、throw式によって参照されるオブジェクト(存在する場合)ではなく、例外オブジェクトへの参照を初期化します。

+0

は一言で言えば、あなたは同じオブジェクト 'e'をキャッチしないでください。 – spraff

+0

それは1つの歓声です! (そして、これは、あなたが '投げる'ではなく '投げる'で再投げるように気を付ける必要があることを意味する) –

0

仕様書の内容はわかりませんが、実際には、RTTIを使用して正しいキャッチブロックに例外が送出されているようです。 "const"は無関係です。

+0

限りtypeid'が懸念している 'のように、最上位レベルのCV-修飾子(' const'と 'volatile')が破棄され、明確にします。しかし、私はこれがここの問題ではないと思うし、チャールズの答えにもっと傾くだろう。 DoThrow(E) ''に与えられているよう –