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

Что выведет: какие специальные функции вызваны

Вопрос

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

#include <iostream>
#include <utility>

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

int main() {
    S a;
    S b = a;
    S c = std::move(a);
    b = c;
    c = S();
}

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

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

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

Коротко

Код выведет: ctor, copy, move, copy=, ctor, move=, dtor, dtor, dtor, dtor. S b = a это инициализация, а не присваивание: копирующий конструктор.

Что выведет

ctor
copy
move
copy=
ctor
move=
dtor
dtor
dtor
dtor

Разбор

S b = a это инициализация, а не присваивание: копирующий конструктор. S c = std::move(a) перемещающий конструктор. b = c копирующее присваивание. c = S(): создаётся временный объект (ctor), перемещающее присваивание, временный уничтожается (dtor). В конце уничтожаются c, b, a: ещё три dtor.

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

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