2010-02-26 12 views
7

Ich weiß nicht, wie man die Frage in einer kurzen Betreffzeile sehr gut formuliert, also lassen Sie mich eine längere Erklärung versuchen. Angenommen, ich habe diese Ausnahmeklassen:Können Sie eine Ausnahme nach dem Typ eines Konvertierungsoperators abfangen?

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

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

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

Kann ich das dann tun, und habe es den Catch-Block auslösen?

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

Ich werde, dass es nicht, erraten, was schade ist, aber ich dachte, ich würde fragen, da ich keine Informationen über sie im Netz oder auf SO finden konnte. Und ja, ich weiß, ich könnte das Programm einfach in meinem Compiler ausführen und sehen, was passiert, aber das würde mir nicht sagen, was der Standard über dieses Verhalten sagt, was mein Compiler implementiert (und ich traue ihm nicht).

Antwort

13

Sie können nicht. Standardese bei 15.3/3:

A-Handler ist ein Spiel für ein Ausnahme-Objekt vom Typ E, wenn

  • Der Handler vom Typ cv T oder cv T& und E und T ist der gleiche Typ (ignoriert oben- Ebene CV- Qualifier) ​​oder
  • der Handler ist vom Typ cv T oder cv T& und T ist eine eindeutige öffentliche Basisklasse E, oder
  • der Handler ist vom Typ cv1 T* cv2 und E ist ein Zeigertyp, die
    • ein Standard-Zeiger-Konvertierung (4.10) nicht Conversions Zeiger auf Privat auf den Typ des Handlers durch eine oder beide umgewandelt werden können oder geschützt oder mehrdeutig Klassen beteiligt
    • eine Qualifikation Umwandlung

Ihr gewünschte Szenario passt nichts davon. cv bedeutet "const und/oder flüchtige Kombination"

+1

Phew. Ein Seufzer der Erleichterung hier. – sbi

+0

deckt dies Zeiger auf Mitglieder ab? Zum Beispiel ist der Zeiger zu den Member-Daten kontravariant, so dass "int (Base :: *)" in "int (Derived :: *)" umgewandelt werden kann. kann ich letzteres fangen, wenn ich das erstere werfe? gcc scheint nicht zu stimmen, aber die Standardformulierung ist ein wenig unklar. – max