在右值引用参数上使用 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
有一个名字,因此它是函数内部的一个左值。右值引用绑定到左值 x
。 std::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?
是的,同上。
我在看一本关于用 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
有一个名字,因此它是函数内部的一个左值。右值引用绑定到左值 x
。 std::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?
是的,同上。