返回值是否将通过 c++0x 中的右值引用传递?
-
19-09-2019 - |
题
假设我有一个函数:
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它必须使用移动构造函数,而不是拷贝构造函数。
不隶属于 StackOverflow