考虑以下功能:
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);
}
除了避免复制之外,是否存在语义差异?
答案 0 :(得分:9)
是的,有差异。考虑以下情况:
std::vector<int> v = get_vector();
在第一种情况下,我们可以执行命名返回值优化。这意味着局部变量xs
实际上将在v
中构建到位。这里根本不会动。这是尽可能高效的。
在第二种情况下,xs
已在本地构建,以便可以将其移出。 NRVO是不可能的,所以会有一个举动。所以这严重更糟。
现在考虑以下情况:
auto&& v = get_vector();
在第一种情况下,这没关系。 get_vector()
返回一个临时的,绑定到引用并在v
的生命周期内进行扩展。
在第二种情况下,我们只是引用了临时xs
,现在有一个悬空引用。这很糟糕。
总结:总是希望按值返回您的本地人。从调用者的角度来看,它们已经已经 rvalues,因此明确地将它们作为rvalue引用没有任何优势。
答案 1 :(得分:2)
没有副本。如果可以,呼叫者将移动它。此外,在第二个中,您将返回对本地的引用,这是不好的。