Что выведет код Middle Правило 0/3/5 обновлено
Что выведет: гарантированный пропуск копирования
Вопрос
Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.
#include <iostream>
struct S {
S() { std::cout << "ctor\n"; }
S(const S&) { std::cout << "copy\n"; }
S(S&&) noexcept { std::cout << "move\n"; }
~S() { std::cout << "dtor\n"; }
};
S make() { return S(); }
int main() {
S s = make();
S t = S(S(S()));
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: ctor, ctor, dtor, dtor. С C++17 инициализация из prvalue того же типа не создаёт временных объектов: return S() и S(S(S())) материализуют объект сразу в месте назначения.
Что выведет
ctor
ctor
dtor
dtor
Разбор
С C++17 инициализация из prvalue того же типа не создаёт временных объектов: return S() и S(S(S())) материализуют объект сразу в месте назначения. Ни копирования, ни перемещения не вызывается, даже без оптимизаций. Итого два конструктора и два деструктора (сначала t, потом s).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет: деструктор отключил перемещение
Следующий вопрос
Что выведет: какие специальные функции вызваны
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор