Supongamos que tengo:¿Cuál es la especificación de excepción para un destructor virtual predeterminado en C++ 11?
class Foo
{
public:
virtual ~Foo()=default;
};
¿Cuál es la excepción de especificación en el destructor en default? Es el destructor en mora equivalente a:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
Sección 15.4 del estándar de C++ 11 dice que depende de las especificaciones de excepción de las funciones directamente invocadas por definición implícita del destructor. En este caso, no hay miembros ni clases base, por lo que AFAIK no hay funciones invocadas directamente por el destructor implícito. ¿Es esto una ambigüedad (u omisión) en el estándar?
Importa, por supuesto, porque si implícitamente tiene throw(), entonces todas las subclases deben declarar sus destructores con throw(). No me digas que es una mala idea arrojar excepciones en los destructores, lo sé. Me ocupo de un montón de código heredado donde las especificaciones de excepción no se utilizaron en absoluto.
Como punto de información, cuando lo probé:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
me dio un error (Ficha de excepción no coincidentes) en GCC 4.4 (aunque admito que puede que no haya tenido la línea de comando de la derecha cambia), pero no en XCode 4.3 utilizando los compiladores "11".
Gracias por la respuesta. Para realizar un seguimiento un poco más, la especificación dice "Se considera implícitamente que una declaración de un destructor que no tiene una especificación de excepción tiene la misma especificación de excepción que una declaración implícita" Entonces, "virtual ~ SubFoo();" (sin una especificación de excepción) no está mal formado, a menos que invoca directamente funciones que implícita o explícitamente permiten lanzar? – user1414050
@ user1414050: Creo que es correcto, sí, pero nosotros ' Estoy adentrándome en los rincones más oscuros del lenguaje, no apostaría mucho a que la mayoría de los compiladores lo entiendan todavía. En particular, sospecho que muchos compiladores (¿la mayoría?) tratan 'virtual ~ SubFoo();' con el significado "pueden arrojar cualquier cosa ", al igual que lo haría con una función normal. –
Creo que esta conclusión puede no ser válida, ya que el" si y solo si "se contradice con la siguiente oración parcial sobre allowin g todas las excepciones (es decir, el estándar es autocontradictorio aquí). Y creo que es cuestionable si la intención es que los destructores no tengan tiro por defecto. Porque eso sería incompatible con C++ 03. –