Ответ 1
Согласно § 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;
}
}
Это мое понимание цитаты.