[我正在读一本有关用C ++实现的数据结构的书,我听不懂代码片段,它是向量类的一部分
void push_back(object &&x) {
//do something
objects[size++] = std::move(x);
}
[我知道std::move
返回对象的右值引用,但是push_back
成员函数已经有右值引用x
作为参数,std::move
在这里不是必需的吗?
[另一个问题是,如果我们有一个类对象的右值引用,如果我们想调用move而不是copy right,我们仍然需要在其成员上使用std::move
吗?像下面的代码:
A& operator=(A&& other) {
member = std::move(other.member);
return *this;
}
x
有一个名称,因此它是函数内部的左值。右值引用绑定到左值x
。 std::move
将其强制转换回传入的右值。
std :: mour这里不需要吗?
没有类型和value categories是不同的东西。
(重点是我的)
每个C ++表达式(具有其操作数,文字,变量名等的运算符)的特征是两个独立的属性:类型和值类别。
以下表达式是左值表达式:
变量名,函数名,模板参数对象(自C ++ 20)或数据成员(无论类型如何),例如std :: cin或std :: endl。 即使变量的类型是右值引用,由名称组成的表达式是左值表达式;
std::move
将左值转换为右值(xvalue)。作为一个命名变量,x
是一个左值,std::move
将其转换为objects[size++] = std::move(x);
中的右值,然后应使用移动分配运算符。否则,将使用副本分配运算符;左值不能绑定到右值引用。
如果我们要调用move而不是复制权,我们仍然需要在其成员上使用std :: move?
是,与上述相同。