将对象的返回值存储在引用中是否有效?
class A { ... };
A myFunction()
{
A myObject;
return myObject;
} //myObject goes out of scope here
void mySecondFunction()
{
A& mySecondObject = myFunction();
}
是否可以这样做以避免将myObject复制到mySecondObject?不再需要myObject,它应该与mySecondObject完全相同,因此理论上将对象的所有权从一个对象传递到另一个对象会更快。 (这也可以使用boost共享指针,但是它具有共享指针的开销。)
提前致谢。
答案 0 :(得分:29)
不允许将临时绑定到非const引用,但如果您创建引用const,则会将临时的生命周期延长到引用,请参阅this Danny Kalev post about it。
简而言之:
const A& mySecondObject = myFunction();
答案 1 :(得分:7)
您可能对许多编译器为避免调用复制构造函数而生成的return-by-value optimization感兴趣。
答案 2 :(得分:6)
可以使用const引用。
myFunction
按值返回,因此返回值是临时对象。您可以将临时绑定到const引用,并将临时的生命周期扩展到引用的生命周期。您不能将临时绑定到非const引用(不幸的是)。
myFunction
的返回值可能是myObject
的副本。从好的方面来说,复制构造函数elision(在本例中也称为“命名返回值优化”)允许编译器直接构造myObject
到临时值,这是myFunction
的返回值,可能位于某处在调用代码的堆栈上。如果它这样做,那么当myObject
超出范围时,对象实际上不会被销毁。通常实现优化 - 例如GCC(通常是?)甚至没有任何优化标志。
复制ctor elision还允许编译器避免所有复制:
A mySecondObject = myFunction();
这需要应用两种合法类型的复制文件:(1)从函数返回命名值,以及(2)从临时文件初始化对象。