Что выводит возврат временного объекта в C++17?

Вывод — ctor, затем dtor. Начиная с C++17 временное значение A{} создаёт итоговый объект непосредственно; вызовы copy и move здесь не требуются.

Короткий ответ

Что ответить на собеседовании

Вывод — 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее