2010-02-26 49 views
7

我不知道如何在短題目中很好地解釋這個問題,所以讓我試試更長的解釋。假設我有這些異常類:您能否通過轉換運算符的類型捕獲異常?

class ExceptionTypeA : public std::runtime_error 
{ 
    // stuff 
}; 

class ExceptionTypeB : public std::runtime_error 
{ 
    // stuff 

    operator ExceptionTypeA() const; // conversion operator to ExceptionTypeA 
}; 

我可以這樣做,並讓它觸發catch塊嗎?

try 
{ 
    throw ExceptionTypeB(); 
} 
catch (ExceptionTypeA& a) 
{ 
    // will this be triggered? 
} 

我要去猜測,不會,這是不幸的,但我認爲我會問,因爲我無法在網絡上找到或SO上的任何信息。是的,我意識到我可以在我的編譯器中運行該程序,看看會發生什麼,但是這不會告訴我標準對此行爲的描述,只是我的編譯器實現了什麼(我不相信它)。

回答

13

你不能。 Standardese在15.3/3

處理程序爲類型E的異常對象的匹配,如果

  • 該處理程序是cv T型或cv T&和E和T是同一類型的(忽略頂水平CV- 限定符),或
  • 的處理程序是cv T類型或cv T&的,T是一個明確的公共基地E類的,或
  • 的處理程序是類型的3210和E是指針類型,可以由任一個或兩者的被轉換成該處理程序 的類型
    • 標準指針轉換(4.10)不涉及轉換到指針私有或保護或 曖昧類
    • 資格轉換

你想要的場景相匹配沒有這些。 cv的意思是「常量和/或揮發性組合」

+1

Phew。這裏鬆了一口氣。 – sbi 2010-02-26 17:04:54

+0

是否會覆蓋指向成員的指針?例如,指向成員數據的指針是逆變的,所以'int(Base :: *)'可以轉換爲'int(Derived :: *)'。如果我扔掉前者,我能抓住後者嗎?海灣合作委員會似乎不同意,但標準的措辭有點不清楚。 – max 2016-03-30 15:05:50