Возвращаемый класс или структура могут копироваться или не копироваться, в зависимости от того, использует ли компилятор разрешение на копирование. См. Ответы на Что такое оптимизация копирования и возвращаемое значение?
Короче говоря, копируется или нет, зависит от ряда вещей.
Конечно, вы можете избежать копирования, вернув ссылку. В вашем примере возвращение ссылки недопустимо (хотя компилятор это допустит), потому что локальная структура размещена в стеке, и поэтому возвращенная ссылка ссылается на освобожденный объект. Однако, если объект был передан вашей функции (напрямую или как член объекта), вы можете безопасно вернуть ссылку на него и избежать копирования при возврате.
Наконец, если вы не можете доверять копии elision и хотите избежать копирования, вы можете использовать и возвращать unique_ptr
вместо ссылки. Сам объект не будет скопирован, хотя сам unique_ptr
может быть или не быть (опять же, в зависимости от разрешения копирования!). Однако копирование / перемещение unique_ptr
обходится очень дешево, если по какой-то причине исключение копирования unique_ptr
не происходит.
Вот пример использования unique_ptr
:
#include <memory>
struct A {
public:
int x;
int y;
A(int x, int y) : x(x), y(y) {
}
};
std::unique_ptr<A> returnsA() {
return std::make_unique<A>(3, 4);
}
int main() {
auto a = returnsA();
}
Обратите внимание, что вы (к сожалению) должны объявить конструктор для вашей структуры, иначе make_unique
не будет компилироваться из-за недостатков C ++.