【问题标题】:Is this a correct usage of rvalue references? [duplicate]这是右值引用的正确用法吗? [复制]
【发布时间】:2015-09-12 13:21:19
【问题描述】:

考虑以下函数:

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);
}

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

【问题讨论】:

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


    【解决方案1】:

    是的,有区别。考虑以下情况:

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

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

    在第二种情况下,xs 必须在本地构建,以便可以将其移出。 NRVO是不可能的,所以会有动作。所以情况更糟。

    现在考虑以下情况:

    auto&& v = get_vector();
    

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

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

    总而言之:总是更喜欢按值返回本地人。从调用者的角度来看,它们已经是右值,因此明确地使它们成为右值引用没有任何好处。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 2015-06-03
        • 2013-02-01
        相关资源
        最近更新 更多