Что выведет код Junior Исключения спрашивают часто обновлено

Что выведет: раскрутка стека

Вопрос

Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.

#include <iostream>
#include <stdexcept>

struct G {
    const char* n;
    ~G() { std::cout << '~' << n << '\n'; }
};

void f() {
    G a{"a"};
    throw std::runtime_error("boom");
}

int main() {
    try {
        G outer{"outer"};
        f();
        G never{"never"};
    } catch (const std::exception& e) {
        std::cout << "caught " << e.what() << '\n';
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: ~a, ~outer, caught boom. При броске раскручивается стек: сначала уничтожается a в f, затем outer в try-блоке.

Что выведет

~a
~outer
caught boom

Разбор

При броске раскручивается стек: сначала уничтожается a в f, затем outer в try-блоке. Объект never не создавался, его деструктор не вызывается. Только после этого управление попадает в catch.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме