考虑这段代码:
class A {
private:
std::string data;
public:
void set_data(std::string&& data) {
this->data = std::move(data); // line 6
}
};
int main() {
std::string move_me = "Some string";
A a;
a.set_data(std::move(move_me)); // line 13
}
我知道我们需要在第 13 行调用 std::move()
以便它将左值转换为右值引用(听起来正确吗?我是新手) .
然而,在第 6 行,我们是否需要再次使用 std::move()
?我假设不会,因为我们已经传递了一个右值引用并且将调用 std::string
的 move 构造函数。对吗?
最佳答案
However, on line 6, do we need to use
std::move()
again?
是。为什么?因为在 set_data
中,data
(参数)是一个左值,因为它有一个名字。两个 std::move
都是将 move_me
实际 move 到 a
中的 data
所必需的。
如果 6
行没有 std::move
,move_me
将不会被 move ,因为那会调用 std::string(const std::string&)
,而不是 std::string(std::string&&)
。
记住 - 如果某物有名字,它就是一个左值。
关于c++ - 在 C++ 中使用 move 语义的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52353664/