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)
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,我们仍然需要在其成员上使用吗?
是的,原因和上面一样。