返回值是否会在c ++ 0x中通过rvalue引用传递?

时间:2009-08-22 20:08:16

标签: c++ return-value c++11 rvalue-reference return-value-optimization

假设我有一个功能:

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()应该被视为一个右值,因此应该调用v的移动构造函数,但我不完全确定这是真的。

2 个答案:

答案 0 :(得分:7)

规则如下

  • 如果编译器可以执行RVO,则允许执行此操作,并且不会进行复制和移动。
  • 否则,将采用适当的构造函数。

就像你说的那样,临时是一个右值,因此选择了移动构造函数,因为13.3.3.2/3中有一个规则,它表示右值引用比左值引用更好地绑定到右值。在决定是使用移动还是复制构造函数时,重载解析将因此更喜欢移动构造函数。

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

答案 1 :(得分:2)

所有返回值都被认为是rvalues所以如果编译器在这种情况下没有实现RVO,它必须使用移动构造函数而不是复制构造函数。