Пропуск копирования при возврате в C++
При возврате локального объекта по значению компилятор часто применяет пропуск копирования и не вызывает копирующий конструктор.
Это правило именованного возвращаемого значения сохраняет объект прямо в месте вызова. Чтобы увидеть эффект, добавим в тип копирующий конструктор с печатью в консоль. Запишем функцию, которая возвращает локальную структуру, и проверим вывод:
#include <iostream>
struct Banner {
Banner() = default;
Banner(const Banner&) {
std::cout << "copy\n";
}
};
Banner make_banner() {
Banner local;
return local;
}
int main() {
Banner item = make_banner();
return 0;
}
Строка "copy" не появляется: временный
объект не копируют в item отдельным
вызовом конструктора копирования.
Так стандарт избегает лишней работы при
возврате по значению.
Объявите struct Cell с копирующим
конструктором, печатающим "copy".
Напишите функцию, возвращающую локальный
Cell, и сохраните результат в
переменную в main. Убедитесь, что
сообщение не выводится.