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