假设我有一个功能:
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的移动构造函数,但我不完全确定这是真的。
答案 0 :(得分:7)
规则如下
就像你说的那样,临时是一个右值,因此选择了移动构造函数,因为13.3.3.2/3
中有一个规则,它表示右值引用比左值引用更好地绑定到右值。在决定是使用移动还是复制构造函数时,重载解析将因此更喜欢移动构造函数。
允许编译器执行RVO的规则是12.8/15
写的。
答案 1 :(得分:2)
所有返回值都被认为是rvalues
所以如果编译器在这种情况下没有实现RVO,它必须使用移动构造函数而不是复制构造函数。