В C++11 и новее будет вызван std::terminate: деструктор X неявно noexcept, а исключение выходит из него. Внешний catch не получит этот int.
Что происходит, когда деструктор генерирует исключение
В C++11 и новее будет вызван std::terminate: деструктор X неявно noexcept, а исключение выходит из него. Внешний catch не получит этот int.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет получен при вызове следующей функции?
void test_exception_in_destructor()
{
struct X {
~X() {
throw 1;
}
};
try {
X x;
} catch (...) {
}
}
Ответ
В C++11 и новее будет вызван std::terminate: деструктор X неявно noexcept, а исключение выходит из него. Внешний catch не получит этот int.
В примере нет второго активного исключения: объект разрушается при обычном выходе из try. Уже одного нарушения noexcept достаточно для завершения.
Если явно написать ~X() noexcept(false), именно в этом сценарии catch сможет поймать исключение. Но выбрасывание из деструктора во время раскрутки стека всё равно приводит к terminate. Практически безопаснее сообщать о возможных ошибках отдельным методом, а деструктор делать не бросающим.