这会对代码产生任何影响吗
Would this make any difference in the code
我想了解 std::move 的作用,它似乎只是转换为右值引用。在这种情况下,下面两段代码是相等的,对吧?即使对于第二种情况,我们也无法调用移动构造函数。否则移动后输入的人将失效。我的理解正确吗?
void setSomething(Person person) {
localPerson_ = person;
}
v.s.
void setSomething(Person person) {
localPerson_ = std::move(person);
}
是的,这很重要。
it's just casting to rvalue reference.
准确地说它转换为右值。参数 person
是左值,std::move
会将其转换为右值。对于localPerson_ = person;
,进行复制赋值;对于 localPerson_ = std::move(person);
,执行移动分配。换句话说,我们需要明确地使用 std::move
才能执行移动操作。之后 person
的状态将取决于 Person
.
的实施
第一种情况调用赋值运算符。 Person
之后仍然有效。
第二种情况调用移动赋值运算符。 Person
移动后失效。对于一些无效的定义,取决于移动赋值运算符代码。它应该类似于默认构造的对象。
我想了解 std::move 的作用,它似乎只是转换为右值引用。在这种情况下,下面两段代码是相等的,对吧?即使对于第二种情况,我们也无法调用移动构造函数。否则移动后输入的人将失效。我的理解正确吗?
void setSomething(Person person) {
localPerson_ = person;
}
v.s.
void setSomething(Person person) {
localPerson_ = std::move(person);
}
是的,这很重要。
it's just casting to rvalue reference.
准确地说它转换为右值。参数 person
是左值,std::move
会将其转换为右值。对于localPerson_ = person;
,进行复制赋值;对于 localPerson_ = std::move(person);
,执行移动分配。换句话说,我们需要明确地使用 std::move
才能执行移动操作。之后 person
的状态将取决于 Person
.
第一种情况调用赋值运算符。 Person
之后仍然有效。
第二种情况调用移动赋值运算符。 Person
移动后失效。对于一些无效的定义,取决于移动赋值运算符代码。它应该类似于默认构造的对象。