2012-01-19 41 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; 
} 

我想改進常量在我的項目中的正確性和無意中創建了上述情況。就目前而言,在Dev Studio中,catch塊會捕獲異常,儘管它被拋出爲const &,但被捕獲爲非const &。

問題 - 應該嗎? :-)

回答

9

throw接受一個表達式並基於該表達式的靜態類型通過複製初始化創建一個異常對象。異常對象不是const對象。

catch語句初始化對異常對象的引用,而不是對throw表達式引用的對象(如果有的話)。

+0

簡而言之,您不會收到與'DoThrow(e)'相同的對象'e'。 – spraff

+0

這是一個 - 乾杯! (這也意味着你應該注意用'throw'重新拋出,而不是'扔掉';) –

0

我不知道規範說什麼,但在我看來,在實踐中,使用RTTI將異常分派到正確的「catch」塊(某些編譯器合成代碼必須執行此操作),與「const」無關。

+0

要明確,就'typeid'而言,頂級cv-qualifiers('const'和'volatile')會被丟棄。不過,我認爲這不是問題,並且會更傾向於查爾斯的答案。 –