繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM