Ruu*_*uud 24 c++ reference return-value
将对象的返回值存储在引用中是否有效?
class A { ... };
A myFunction()
{
A myObject;
return myObject;
} //myObject goes out of scope here
void mySecondFunction()
{
A& mySecondObject = myFunction();
}
Run Code Online (Sandbox Code Playgroud)
是否可以这样做以避免将myObject复制到mySecondObject?不再需要myObject,它应该与mySecondObject完全相同,所以理论上将对象的所有权从一个对象传递到另一个对象会更快.(这也可以使用boost共享指针,但是它具有共享指针的开销.)
提前致谢.
Ale*_*ing 32
不允许将临时绑定到非const引用,但是如果你创建引用const,则会将临时的生命周期延长到引用,请参阅Danny Kalev关于它的帖子.
简而言之:
const A& mySecondObject = myFunction();
Run Code Online (Sandbox Code Playgroud)
使用const引用是可能的.
myFunction按值返回,以便返回值是临时对象.您可以将临时绑定到const引用,并将临时的生命周期扩展到引用的生命周期.您不能将临时绑定到非const引用(不幸的是).
的返回值myFunction可能是一个复制的myObject.从好的方面来说,复制构造函数elision(在这种情况下也称为"命名返回值优化")允许编译器myObject直接构造临时,它是返回值myFunction,可能位于调用代码堆栈的某个位置.如果它这样做,那么当myObject超出范围时,对象实际上不会被销毁.通常实现优化 - 例如GCC(通常是?)甚至没有任何优化标志.
复制ctor elision还允许编译器避免所有复制,如果你这样做:
A mySecondObject = myFunction();
Run Code Online (Sandbox Code Playgroud)
这需要应用两种合法类型的复制文件:(1)从函数返回命名值,以及(2)从临时文件初始化对象.