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

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)

  • 我不确定,但我猜测原因是允许非常量引用意味着需要编译器来确定何时重新分配引用。我认为这通常被视为动态范围分析的一部分,并且在C ++标准中未使用。另一方面,在const情况下,仅需要确定参考的静态寿命。在其他情况下可能已经需要进行此分析,因此被认为可以接受。 (3认同)
  • 您的链接已损坏。我找到了另一个[link](http://www.informit.com/blogs/blog.aspx?uk=30-C-Tips-in-30-Days-Tip-28-the-lifetime-of-a -临时对象绑定到参考),但看起来不完整。 (3认同)
  • 您是否知道为什么不允许这样做? (2认同)

Ste*_*sop 7

使用const引用是可能的.

myFunction按值返回,以便返回值是临时对象.您可以将临时绑定到const引用,并将临时的生命周期扩展到引用的生命周期.您不能将临时绑定到非const引用(不幸的是).

的返回值myFunction可能是一个复制myObject.从好的方面来说,复制构造函数elision(在这种情况下也称为"命名返回值优化")允许编译器myObject直接构造临时,它是返回值myFunction,可能位于调用代码堆栈的某个位置.如果它这样做,那么当myObject超出范围时,对象实际上不会被销毁.通常实现优化 - 例如GCC(通常是?)甚至没有任何优化标志.

复制ctor elision还允许编译器避免所有复制,如果你这样做:

A mySecondObject = myFunction();
Run Code Online (Sandbox Code Playgroud)

这需要应用两种合法类型的复制文件:(1)从函数返回命名值,以及(2)从临时文件初始化对象.


Hud*_*son 7

您可能对许多编译器为避免调用复制构造函数而进行的按值返回优化感兴趣.