这是右值引用的正确用法吗?
Is this a correct usage of rvalue references?
考虑以下函数:
vector<int> get_vector()
{
vector<int> xs;
// Do some stuff to fill the vector with numbers...
return xs;
}
这样写有意义吗?主要目标是在返回vector时避免复制vector。
vector<int>&& get_vector()
{
vector<int> xs;
// Do some stuff to fill the vector with numbers...
return std::move(xs);
}
除了避免复制之外,还有什么语义上的区别吗?
是的,有区别。考虑以下情况:
std::vector<int> v = get_vector();
在第一种情况下,我们可以执行命名返回值优化。这意味着局部变量xs
实际上将在v
中的位置构造。这里什么也不许动。这是尽可能高效的。
在第二种情况下,xs
必须在本地构建,以便将其移出。NRVO是不可能的,所以会有行动。所以这更糟糕。
现在考虑以下情况:
auto&& v = get_vector();
在第一种情况下,这是可以的。get_vector()
返回一个临时对象,它被绑定到引用,并在v
的生命周期内扩展。
在第二种情况下,我们只是对临时xs
的引用,现在有一个悬垂引用。
没有副本。如果可以的话,呼叫者会移动它。此外,在第二个示例中,您返回了对局部的引用,这很糟糕。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- C++:类类型引用运算符=用法
- 右值引用用法:需要
- 引用和指向常量的指针的用法是什么
- 这种引用的用法不正确吗
- 简单的类用法+未定义的引用
- 引用用法对C++的影响
- 常量引用在C++中的用法
- 有人能解释一下这个C++引用的用法吗
- 这是右值引用的正确用法吗?
- 引用unique_ptr是否是一种不好的用法?