使用rd引用参数移动std :: mo的原因

问题描述 投票:4回答:2

[我正在读一本有关用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;
}
c++ move-semantics rvalue-reference value-categories
2个回答
3
投票

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


3
投票

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?

是,与上述相同。

© www.soinside.com 2019 - 2024. All rights reserved.