假设我有一个函数:

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的move构造函数,但我不能完全确定这是正确的。

最佳答案

规则如下

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

  • 就像您说的那样,由于13.3.3.2/3中的规则,临时变量是一个右值,因此选择了移动构造函数,该规则表示右值引用比左值引用更好地绑定(bind)到右值。在决定使用move还是copy构造函数时,为此,重载分辨率将首选move构造函数。

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

    关于c++ - 返回值将通过c++ 0x中的右值引用传递吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1316924/

    10-14 09:12