Согласно §15.2 / 2:
Объект, который частично построен или частично разрушен, будет иметь деструкторы, выполненные для всех полностью построенных подобъектов, то есть для подобъектов, для которых конструктор завершил выполнение, а деструктор еще не начал выполнение.
Таким образом, деструктор базового класса должен быть вызван. То есть, как мы знаем, это очистит базовый класс:
#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;
}
}
И что это очистит член:
#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;
}
}
Это также очистит базовый класс:
#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;
}
}
Это мое понимание цитаты.