Что выведет код Middle Move-семантика обновлено

Что выведет: std::move и const

Вопрос

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

#include <iostream>
#include <utility>

struct S {
    S() = default;
    S(const S&) { std::cout << "copy\n"; }
    S(S&&) noexcept { std::cout << "move\n"; }
};

int main() {
    const S a;
    S b = std::move(a);
    S c;
    S d = std::move(c);
    S&& r = std::move(d);
    S e = r;
    S f = std::move(r);
}

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

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

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

Коротко

Код выведет: copy, move, copy, move. std::move(a) даёт const S&&, подходит только копирующий конструктор. std::move(c) даёт S&&: перемещение. r это именованная rvalue-ссылка, то есть lvalue: S e = r копирует. std::move(r) снова rvalue: перемещение.

Что выведет

copy
move
copy
move

Разбор

std::move(a) даёт const S&&, подходит только копирующий конструктор. std::move(c) даёт S&&: перемещение. r это именованная rvalue-ссылка, то есть lvalue: S e = r копирует. std::move(r) снова rvalue: перемещение.

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

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