Вывод — ctor, затем dtor. Начиная с C++17 временное значение A{} создаёт итоговый объект непосредственно; вызовы copy и move здесь не требуются.
Что выводит возврат временного объекта в C++17?
Вывод — ctor, затем dtor. Начиная с C++17 временное значение A{} создаёт итоговый объект непосредственно; вызовы copy и move здесь не требуются.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод программы при C++17 или новее:
#include <iostream>
struct A {
A() { std::cout << "ctor\n"; }
A(const A&) { std::cout << "copy\n"; }
A(A&&) { std::cout << "move\n"; }
~A() { std::cout << "dtor\n"; }
};
A make() { return A{}; }
int main() { A a = make(); }
Ответ
Вывод — ctor, затем dtor. Начиная с C++17 временное значение A{} создаёт итоговый объект непосредственно; вызовы copy и move здесь не требуются.
Объект a живёт до конца main, поэтому его деструктор вызывается один раз при выходе. Не следует смешивать этот случай с A x; return x;: возврат именованной локальной переменной связан с NRVO, которое при выполнении условий разрешено, но не обязательно. Различие важно, когда конструкторы копирования или перемещения имеют наблюдаемые побочные эффекты.
Источник: eel.is.