2010-02-26 13 views
7

Nie wiem, jak sformułować pytanie bardzo dobrze w krótkim temacie, więc pozwólcie, że spróbuję dłuższego wyjaśnienia. Załóżmy, że mam te klasy wyjątków:Czy możesz złapać wyjątek według typu operatora konwersji?

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

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

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

Czy mogę to zrobić, i czy spowoduje to blok catch?

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

Idę się domyślić, że to nie będzie, co jest niefortunne, ale pomyślałem, że pytam, ponieważ nie mogłem znaleźć żadnych informacji na jej temat w internecie lub na SO. I tak, zdaję sobie sprawę, że mogłem po prostu uruchomić program w moim kompilatorze i zobaczyć, co się stanie, ale to nie powiedziałoby mi, co standard mówi o tym zachowaniu, tylko o tym, co mój kompilator implementuje (i nie ufam temu).

Odpowiedz

13

Nie możesz. Standardese w 15.3/3:

Procedura obsługi jest dopasowana do obiektu wyjątek typu E, jeżeli

  • Funkcja jest typu cv T lub cv T& i E i T są tego samego typu (pomijając górnym, poziom CV- kwalifikacyjne) lub
  • handler jest typu cv T lub cv T& T jest jednoznaczne klasa publiczna baza E lub
  • handler jest typu cv1 T* cv2 i E jest rodzajem wskaźnika, który może być przekształcony w rodzaju obsługi przez jedną lub obie
    • standardowym konwersji wskaźnik (4,10) nie jest związane konwersji do wskaźników prywatny lub chronionych lub niejednoznaczne klas
    • kwalifikacje konwersja

Twój pożądany scenariusz pasuje do żadnego z nich. cv oznacza "const i/lub lotną kombinację"

+1

Uff. Tu westchnienie ulgi. – sbi

+0

czy obejmuje to wskaźnik dla członków? na przykład wskaźnik do danych pręta jest kontrawariantny, więc 'int (Base :: *)' można przekonwertować na 'int (Derived :: *)'. czy mogę złapać to ostatnie, jeśli rzucę tym pierwszym? gcc wydaje się nie zgadzać, ale standardowe sformułowanie jest nieco niejasne. – max

Powiązane problemy