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

rlb*_*ond 6 c++ return-value rvalue-reference return-value-optimization c++11

假设我有一个功能:

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

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

C++ 0x是否明确表示将从randomVector的返回值中避免虚假副本?或者编译器是否需要实现RVO?在我看来,值randomVector()应该被视为一个右值,因此应该调用v的移动构造函数,但我不完全确定这是真的.

Joh*_*itb 7

规则如下

  • 如果编译器可以执行RVO,那么允许它执行它,并且不会进行复制和移动.
  • 否则,采用适当的构造函数.

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

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