Что выведет программа с бросаемыми исключениями в деструкторе?

Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.

Короткий ответ

Что ответить на собеседовании

Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой текст появится в консоли после выполнения следующего кода.

#include <iostream>

using namespace std;

struct explosion_exception : public std::exception {};
struct primary_exception : public std::exception {};

struct Explosive
{
    ~Explosive()
    {
        throw explosion_exception();
    }
};

int main()
{
    try
    {
        Explosive explosive;
        throw string("4545");
    }
    catch (const std::exception&)
    {
        cout << "1";
        // обработчик 1
    }
    catch (primary_exception&)
    {
        cout << "2";
        // обработчик 2
    }
    catch (explosion_exception&)
    {
        cout << "3";
        // обработчик 3
    }
    catch (int&)
    {
        cout << "4";
        // обработчик 4
    }

    return 0;
}

Ответ

Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.

std::string не наследуется от std::exception. Если подходящий обработчик не найден вообще, выполняется ли раскрутка стека перед terminate, зависит от реализации.

Если деструктор Explosive всё же будет вызван при раскрутке, он создаёт дополнительную причину terminate: выпускает исключение и нарушает свой неявный noexcept в C++11+. Поэтому нельзя объяснять исходник только как гарантированный вызов деструктора. Для переносимой компиляции строк следует явно подключать .

Источник: eel.is.

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

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

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

Подробнее