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

时间:2015-09-12 13:21:19

标签: c++ c++11 move-semantics rvalue-reference

考虑以下功能:

vector<int> get_vector()
{
    vector<int> xs;
    // Do some stuff to fill the vector with numbers...
    return xs;
}

编写以下代码是否有意义?主要目标是避免在返回时复制矢量。

vector<int>&& get_vector()
{
    vector<int> xs;
    // Do some stuff to fill the vector with numbers...
    return std::move(xs);
}

除了避免复制之外,是否存在语义差异?

2 个答案:

答案 0 :(得分:9)

是的,有差异。考虑以下情况:

std::vector<int> v = get_vector();

在第一种情况下,我们可以执行命名返回值优化。这意味着局部变量xs实际上将在v中构建到位。这里根本不会动。这是尽可能高效的。

在第二种情况下,xs 已在本地构建,以便可以将其移出。 NRVO是不可能的,所以会有一个举动。所以这严重更糟。

现在考虑以下情况:

auto&& v = get_vector();

在第一种情况下,这没关系。 get_vector()返回一个临时的,绑定到引用并在v的生命周期内进行扩展。

在第二种情况下,我们只是引用了临时xs,现在有一个悬空引用。这很糟糕。

总结:总是希望按值返回您的本地人。从调用者的角度来看,它们已经已经 rvalues,因此明确地将它们作为rvalue引用没有任何优势。

答案 1 :(得分:2)

没有副本。如果可以,呼叫者将移动它。此外,在第二个中,您将返回对本地的引用,这是不好的。