Según §15.2/2:
Un objeto que está construido parcialmente o parcialmente destruidas tendrá destructores ejecutados para todos sus subobjetos totalmente construido, es decir, para subobjetos para los que el constructor ha terminado la ejecución y el destructor aún no ha comenzado la ejecución.
Por lo que debe llamarse al destructor de la clase base. Es decir, al igual que sabemos que esto va a limpiar la clase base:
#include <iostream>
struct foo
{
~foo()
{
std::cout << "clean" << std::endl;
}
};
struct bar : foo
{
bar()
{ // foo is initialized...
throw 0; // ...so its destructor is run
}
};
int main()
{
try
{
bar b;
}
catch (...)
{
std::cerr << "caught" << std::endl;
}
}
Y que esto va a limpiar el miembro:
#include <iostream>
struct foo
{
~foo()
{
std::cout << "clean" << std::endl;
}
};
struct bar
{
~bar()
{ // f has been initialized...
throw 0; // ...so its destructor will run
}
foo f;
};
int main()
{
try
{
bar b;
}
catch (...)
{
std::cerr << "caught" << std::endl;
}
}
Esto también va a limpiar la clase base:
#include <iostream>
struct foo
{
~foo()
{
std::cout << "clean" << std::endl;
}
};
struct bar : foo
{
~bar()
{ // foo has been initialized...
throw 0; // ...so its destructor will run
}
};
int main()
{
try
{
bar b;
}
catch (...)
{
std::cerr << "caught" << std::endl;
}
}
Esa es mi comprensión de la cita.
De memoria, las definiciones de la norma de lo que sucederá si un destructor lanza son tan increíblemente compleja y generalmente horrible que nadie nunca, nunca lanza desde un destructor. También estoy bastante seguro de que todos los contenedores estándar suponen que los destructores no son inteligentes. Básicamente, aunque creo que técnicamente, es legal y definido, la realidad es que nadie lo hace y por muy buenas razones, así que no lo hagas nunca. – Puppy
La muestra que tiene allí no debería ser un problema. d está saliendo de su alcance simplemente en la forma normal de las cosas. Donde las cosas pueden ponerse feas es si la razón d se está destruyendo es que la pila se desenrolla como parte de manejar otra excepción. Es esa posibilidad la que conduce a reglas generales sobre nunca lanzar un destructor. –