Что выведет код Junior RAII и умные указатели спрашивают часто обновлено

Что выведет: порядок конструкторов и деструкторов

Вопрос

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

#include <iostream>
#include <string>

struct Tracer {
    std::string n;
    explicit Tracer(std::string s) : n(std::move(s)) { std::cout << '+' << n << '\n'; }
    ~Tracer() { std::cout << '-' << n << '\n'; }
};

struct Pair {
    Tracer a{"a"};
    Tracer b{"b"};
};

int main() {
    Tracer x{"x"};
    {
        Pair p;
    }
    Tracer y{"y"};
}

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

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

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

Коротко

Код выведет: +x, +a, +b, -b, -a, +y, -y, -x. Члены класса создаются в порядке объявления (a, затем b), а уничтожаются в обратном (b, затем a), когда p выходит из блока.

Что выведет

+x
+a
+b
-b
-a
+y
-y
-x

Разбор

Члены класса создаются в порядке объявления (a, затем b), а уничтожаются в обратном (b, затем a), когда p выходит из блока. Локальные переменные main уничтожаются в обратном порядке создания: сначала y, потом x.

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

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