Сохранить возвращаемое значение функции в ссылке С++

Правильно ли это хранить возвращаемое значение объекта в ссылке?

class A { ... };
A myFunction()
{
    A myObject;
    return myObject;
} //myObject goes out of scope here

void mySecondFunction()
{
    A& mySecondObject = myFunction();
}

Возможно ли это сделать, чтобы избежать копирования myObject в mySecondObject? myObject больше не нужен и должен быть точно таким же, как mySecondObject, поэтому теоретически было бы быстрее просто передать право собственности на объект с одного объекта на другой. (Это также возможно с использованием расширенного общего указателя, но у него есть служебные данные общего указателя.)

Спасибо заранее.

Ответы

Ответ 1

Нельзя привязывать временную ссылку к неконстантной ссылке, но если вы сделаете свою ссылку const, вы продлеваете время жизни временного справочника, см. об этом Дэнни Калеве.

Короче:

const A& mySecondObject = myFunction();

Ответ 3

Это возможно с помощью ссылки const.

myFunction возвращает по значению, поэтому возвращаемое значение является временным объектом. Вы можете привязать временную привязку к константной ссылке, а время жизни временного расширения - до срока службы ссылки. Вы не можете привязать временную ссылку к неконстантной ссылке (к сожалению).

Возвращаемое значение myFunction может быть копией myObject. С положительной стороны, при создании конструктора (например, "именованная оптимизация значения возврата" ) компилятор может построить myObject непосредственно во временное значение, которое является возвращаемым значением myFunction, предположительно расположенным где-то в стеке вызывающий код. Если это произойдет, то, когда myObject выходит за пределы области действия, объект фактически не уничтожается. Оптимизация обычно реализуется - например, GCC (обычно?) Делает это даже без каких-либо флагов оптимизации.

Скопировать ctor elision также позволяет компилятору избежать всех копий, если вы сделали:

A mySecondObject = myFunction();

Для этого требуется применение обоих юридических типов copy ctor elision: (1) возврат именованного значения из функции и (2) инициализация объекта из временного.