Что происходит, когда деструктор генерирует исключение

В 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. Практически безопаснее сообщать о возможных ошибках отдельным методом, а деструктор делать не бросающим.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее