![](/img/trans.png)
[英]Is it legal to use an rvalue reference of `std::future` as a parameter?
[英]Reason to use std::move on rvalue reference parameter
我正在阅读一本关于在 C++ 中实现的数据结构的书,我看不懂代码片段,它是向量 class 的一部分
void push_back(object &&x) {
//do something
objects[size++] = std::move(x);
}
我知道std::move
返回的是object的右值引用,但是push_back
成员function已经有了右值引用x
作为参数,这里的std::move
不是没必要吗?
另一个问题是,如果我们有一个 class object 的右值引用,如果我们想调用 move 而不是版权,我们仍然需要在其成员上使用std::move
吗? 像下面的代码:
A& operator=(A&& other) {
member = std::move(other.member);
return *this;
}
这里的std::move不是没有必要的吗?
不。类型和值类别是不同的东西。
(强调我的)
每个 C++ 表达式(带有操作数、文字、变量名等的运算符)都具有两个独立的属性:类型和值类别。
以下表达式是左值表达式:
变量的名称、function、模板参数 object(C++20 起)或数据成员的名称,无论类型如何,例如 std::cin 或 std::endl。 即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;
std::move
将左值转换为右值(xvalue)。 作为命名变量, x
是一个左值, std::move
将其转换为objects[size++] = std::move(x);
中的右值那么应该使用移动赋值运算符。 否则,将使用复制赋值运算符; 左值不能绑定到右值引用。
如果我们想调用 move 而不是版权,我们仍然需要在其成员上使用
std::move
吗?
是的,原因同上。
x
有一个名称,因此它是 function 中的左值。 右值引用绑定到左值x
。 std::move
将其转换回传入的右值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.