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

zxy*_*122 5 c++ rvalue-reference move-semantics c++11 value-categories

我正在读一本关于用C ++实现的数据结构的书,我不明白代码片段吗?它是向量类的一部分

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

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

另一个问题是,如果我们有一个类对象的右值引用,std::move如果要调用move而不是copy right 还是需要在其成员上使用它?像下面的代码:

A& operator=(A&& other) {
     member = std::move(other.member);
     return *this;
}
Run Code Online (Sandbox Code Playgroud)

Jes*_*uhl 5

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


son*_*yao 5

std::move 这里不是不必要的吗?

不。类型和值类别是不同的东西。

(强调我的)

每个 C++ 表达式(带有操作数的运算符、文字、变量名称等)都具有两个独立的属性:类型值类别

以下表达式是左值表达式:

变量、函数、模板参数对象(C++20 起)或数据成员的名称,无论类型如何,例如 std::cin 或 std::endl。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式

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

std::move如果我们想调用 move 而不是 copy right,我们仍然需要在其成员上使用吗?

是的,原因和上面一样。