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

Что выведет: деструктор отключил перемещение

Вопрос

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

#include <iostream>
#include <utility>

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

struct B {
    A a;
    ~B() {}
};

struct C {
    A a;
};

int main() {
    B b1;
    B b2 = std::move(b1);
    C c1;
    C c2 = std::move(c1);
}

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

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

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

Коротко

Код выведет: copy, move. У B объявлен деструктор, поэтому неявный перемещающий конструктор не объявляется. std::move(b1) связывается с неявным копирующим конструктором B, который копирует член: печатается copy.

Что выведет

copy
move

Разбор

У B объявлен деструктор, поэтому неявный перемещающий конструктор не объявляется. std::move(b1) связывается с неявным копирующим конструктором B, который копирует член: печатается copy. У C пользовательских объявлений нет, генерируется перемещающий конструктор, он перемещает член: move.

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

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