这是rvalue引用的正确用法吗?

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)

除了避免复制之外,还有其他语义差异吗?

Bar*_*rry 9

是的,存在差异.考虑以下情况:

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引用没有任何优势.