假设我有一个函数:

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

有帮助吗?

解决方案

规则如下

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

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top