在右值引用参数上使用 std::move 的原因

Reason to use std::move on rvalue reference parameter

我在看一本关于用 C++ 实现的数据结构的书,我不明白代码片段,它是 vector 的一部分 class

void push_back(object &&x) {
        //do something
        objects[size++] = std::move(x);
    }

我知道 std::move return 对象的右值引用,但是 push_back 成员函数已经有右值引用 x 作为参数,是不是std::move这里不用了?

另一个问题是,如果我们有一个 class 对象的右值引用,如果我们想调用移动而不是复制权,我们仍然需要在它的成员上使用 std::move 吗?喜欢下面的代码:

A& operator=(A&& other) {
     member = std::move(other.member);
     return *this;
}

x 有一个名字,因此它是函数内部的一个左值。右值引用绑定到左值 xstd::move 将其转换回传入的右值。

isn't the std::move here unnecessary?

没有。类型和 value categories 是不同的东西。

(强调我的)

Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category.

The following expressions are lvalue expressions:

the name of a variable, a function, a template parameter object (since C++20), or a data member, regardless of type, such as std::cin or std::endl. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;

std::move 将左值转换为右值 (xvalue)。作为命名变量,x 是左值,std::move 将其转换为 objects[size++] = std::move(x); 中的右值,然后应该使用移动赋值运算符。否则,将使用复制赋值运算符;左值不能绑定到右值引用。

we still need to use std::move on its member if we want to call move instead of copy right?

是的,同上。