Что выведет код 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 ошибок.
Предыдущий вопрос
Почему move должен быть noexcept
Следующий вопрос
Что выведет: гарантированный пропуск копирования
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор