代码之家  ›  专栏  ›  技术社区  ›  rlbond

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

  •  6
  • rlbond  · 技术社区  · 16 年前

    假设我有一个函数:

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

    C++ 0x是否特别指出伪拷贝将从随机向量的返回值中得到避免?或者编译器需要实现RVO吗?在我看来,它的价值 randomVector() 应该被视为一个右值,因此应该调用v的move构造函数,但我不能完全确定这是真的。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Johannes Schaub - litb    16 年前

    规则如下

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

    如您所说,临时值是一个右值,因此根据中的规则选择了移动构造函数。 13.3.3.2/3 也就是说,右值引用比左值引用更好地绑定到右值。在决定是使用move还是copy构造函数时,重载解析将优先使用move构造函数。

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

        2
  •  2
  •   Motti    16 年前

    所有返回值都被认为是 rvalues 因此,如果编译器在这种情况下不实现rvo,它必须使用move构造函数而不是copy构造函数。