Что выведет код Middle Правило 0/3/5 обновлено

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

Вопрос

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

#include <iostream>

struct S {
    S() { std::cout << "ctor\n"; }
    S(const S&) { std::cout << "copy\n"; }
    S(S&&) noexcept { std::cout << "move\n"; }
    ~S() { std::cout << "dtor\n"; }
};

S make() { return S(); }

int main() {
    S s = make();
    S t = S(S(S()));
}

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

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

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

Коротко

Код выведет: ctor, ctor, dtor, dtor. С C++17 инициализация из prvalue того же типа не создаёт временных объектов: return S() и S(S(S())) материализуют объект сразу в месте назначения.

Что выведет

ctor
ctor
dtor
dtor

Разбор

С C++17 инициализация из prvalue того же типа не создаёт временных объектов: return S() и S(S(S())) материализуют объект сразу в месте назначения. Ни копирования, ни перемещения не вызывается, даже без оптимизаций. Итого два конструктора и два деструктора (сначала t, потом s).

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

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