Ответ 1
Нельзя привязывать временную ссылку к неконстантной ссылке, но если вы сделаете свою ссылку const, вы продлеваете время жизни временного справочника, см. об этом Дэнни Калеве.
Короче:
const A& mySecondObject = myFunction();
Правильно ли это хранить возвращаемое значение объекта в ссылке?
class A { ... };
A myFunction()
{
A myObject;
return myObject;
} //myObject goes out of scope here
void mySecondFunction()
{
A& mySecondObject = myFunction();
}
Возможно ли это сделать, чтобы избежать копирования myObject в mySecondObject? myObject больше не нужен и должен быть точно таким же, как mySecondObject, поэтому теоретически было бы быстрее просто передать право собственности на объект с одного объекта на другой. (Это также возможно с использованием расширенного общего указателя, но у него есть служебные данные общего указателя.)
Спасибо заранее.
Нельзя привязывать временную ссылку к неконстантной ссылке, но если вы сделаете свою ссылку const, вы продлеваете время жизни временного справочника, см. об этом Дэнни Калеве.
Короче:
const A& mySecondObject = myFunction();
Вам может быть интересна оптимизация обратного значения, которую многие компиляторы делают, чтобы избежать вызова конструктора копирования.
Это возможно с помощью ссылки const.
myFunction
возвращает по значению, поэтому возвращаемое значение является временным объектом. Вы можете привязать временную привязку к константной ссылке, а время жизни временного расширения - до срока службы ссылки. Вы не можете привязать временную ссылку к неконстантной ссылке (к сожалению).
Возвращаемое значение myFunction
может быть копией myObject
. С положительной стороны, при создании конструктора (например, "именованная оптимизация значения возврата" ) компилятор может построить myObject
непосредственно во временное значение, которое является возвращаемым значением myFunction
, предположительно расположенным где-то в стеке вызывающий код. Если это произойдет, то, когда myObject
выходит за пределы области действия, объект фактически не уничтожается. Оптимизация обычно реализуется - например, GCC (обычно?) Делает это даже без каких-либо флагов оптимизации.
Скопировать ctor elision также позволяет компилятору избежать всех копий, если вы сделали:
A mySecondObject = myFunction();
Для этого требуется применение обоих юридических типов copy ctor elision: (1) возврат именованного значения из функции и (2) инициализация объекта из временного.