【问题标题】: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】:
没有副本。如果可以,调用者将移动它。此外,在第二个中,您返回的是对本地的引用,这很糟糕。