2010-02-26 18 views
7

No sé cómo expresar la pregunta muy bien en una breve línea de asunto, así que déjame intentar una explicación más larga. Supongamos que tengo estas clases de excepción:¿Se puede capturar una excepción por el tipo de operador de conversión?

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

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

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

¿Puedo hacer esto y hacer que active el bloque catch?

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

voy a suponer que no lo hará, lo cual es lamentable, pero pensé que le pediría, ya que no pude encontrar ninguna información sobre el mismo en la red o en el pliego de cargos. Y sí, me doy cuenta de que podría simplemente ejecutar el programa en mi compilador y ver qué pasa, pero eso no me dice qué dice el estándar sobre este comportamiento, solo lo que implementa mi compilador (y no confío en él).

Respuesta

13

No puede. Standardese en 15.3/3:

Un controlador es un partido para un objeto excepción de tipo E si

  • El controlador es de tipo cv T o cv T& y E y T son del mismo tipo (ignorando las láminas superior nivel CV- calificadores), o
  • el controlador es de tipo cv T o cv T& y T es una clase base pública inequívoca de e o
  • el controlador es de tipo cv1 T* cv2 y E es un tipo de puntero que se puede convertir al tipo del manipulador por uno o ambos de
    • una conversión puntero estándar (4.10) que no implique conversiones a punteros a privados o protegidos o clases ambiguas
    • una conversión de calificación

Su escenario deseado no coincide con ninguno de ellos. cv significa "const y/o combinación volátil"

+1

Phew. Un suspiro de alivio aquí. – sbi

+0

hace esto puntero de la cubierta a los miembros? por ejemplo, los datos de puntero a miembro son contravariantes, por lo que 'int (Base :: *)' se puede convertir a 'int (Derived :: *)'. ¿Puedo atrapar el último si tiro el primero? gcc parece estar en desacuerdo, pero la redacción estándar es un poco confusa. – max

Cuestiones relacionadas