6

假设我有一个功能:

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

4

2 回答 2

7

规则如下

  • 如果编译器能做RVO,那么就允许做,不复制也不做移动。
  • 否则,将采用适当的构造函数。

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

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

于 2009-08-22T21:15:07.063 回答
2

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

于 2009-08-23T06:09:49.267 回答