6

比方说,我有一个函数:返回值是通过C++ 0x中的右值引用传递的吗?

typedef std::vector<int> VecType; 
VecType randomVector(); 

int processing() 
{ 
    VecType v = randomVector(); 
    return std::accumulate(v.begin(), v.end(), 0); 
} 

确实的C++ 0x说具体的虚假副本将从randomVector的返回值是可以避免的?或者编译器是否需要实现RVO?在我看来,像值randomVector()应被视为一个右值,从而五世的移动构造函数应该叫,但我不能完全肯定这是真的。

+0

不是一个好问题,恕我直言。该标准不能有用地陈述实现可能做什么,而只是它必须做什么。 – 2009-08-22 21:15:59

+0

实际上,在你给出的例子中,返回值优化是由大多数编译器执行的......所以它没有右值是有效的。 还右值是向函数传递参数更加重要。 – Artyom 2009-08-23 07:40:21

+0

问题的标题有点误导。你的函数返回一个右值而不是引用。但是一个右值引用可以绑定到它,这是发生什么情况下复制elision不能执行出于某种原因,并且该类型有一个移动构造函数(移动构造函数的参数是一个右值引用) – sellibitze 2009-09-27 08:19:29

回答

7

的规则如下

  • 如果编译器可以做视网膜静脉阻塞,则允许这样做,并没有复制,没有移动而成。
  • 否则,适当的构造函数取。

像你说的,暂时是一个右值,因此,转移构造函数被选中,是因为在13.3.3.2/3的规则,它说,一个右值引用结合右值比左值参考更好的。在决定是否使用移动或复制构造函数时,重载解析会优先使用移动构造函数。

编译器被允许执行RVO在12.8/15编写的规则。

2

所有的返回值都被认为是rvalues因此,如果编译器不会在这种情况下,必须使用移动构造函数,而不是拷贝构造函数实现RVO。

+1

我不知道如何解释“必须使用此举”。 AFAIU假设编译器支持U/NRVO,其决策流程如下: 1)如果RVO友好,优化任何移动/复制操作,2)否则如果移动construtor可用,使用它 3)否则如果复制构造函数可用,使用它 4)其他格式不正确的程序 – mloskot 2010-05-27 14:15:10

+0

@mloskot我的意思是移动构造函数被选中,因为它比复制构造函数更适合重载。 – Motti 2010-05-27 20:00:50

+2

明白了。对我而言,隐含的假设是不清楚的。移动ctor被选中,但只有存在。 – mloskot 2010-05-28 07:15:31

相关问题