在参考C ++中存储函数的返回值

时间:2010-05-12 19:45:55

标签: c++ reference return-value

将对象的返回值存储在引用中是否有效?

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

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

是否可以这样做以避免将myObject复制到mySecondObject?不再需要myObject,它应该与mySecondObject完全相同,因此理论上将对象的所有权从一个对象传递到另一个对象会更快。 (这也可以使用boost共享指针,但是它具有共享指针的开销。)

提前致谢。

3 个答案:

答案 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)从临时文件初始化对象。