aoc*_*via 1 c++ rvalue-reference move-semantics c++11
考虑以下功能:
vector<int> get_vector()
{
vector<int> xs;
// Do some stuff to fill the vector with numbers...
return xs;
}
Run Code Online (Sandbox Code Playgroud)
写下面的内容是否有意义?主要目标是避免在返回时复制矢量.
vector<int>&& get_vector()
{
vector<int> xs;
// Do some stuff to fill the vector with numbers...
return std::move(xs);
}
Run Code Online (Sandbox Code Playgroud)
除了避免复制之外,还有其他语义差异吗?
是的,存在差异.考虑以下情况:
std::vector<int> v = get_vector();
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我们可以执行命名返回值优化.这意味着局部变量xs实际上是要建造到位的v.这里根本不会动.这是尽可能高效的.
在第二种情况下,xs 必须在本地构造,以便可以移出.NRVO是不可能的,所以会有一个举动.所以这严重更糟.
现在考虑以下情况:
auto&& v = get_vector();
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,这没关系.get_vector()返回一个临时的,绑定到引用并延长生命周期v.
在第二种情况下,我们只是参考了临时xs,现在有一个悬空参考.这是不好的.
总结:总是希望按值返回您的本地人.从调用者的角度来看,它们已经是 rvalues,因此明确地将它们作为rvalue引用没有任何优势.