为何未调用Move assignment operator?请求解析以下代码
代码行为解释
核心原因很简单:右值引用变量本身是左值。
- 函数参数
Person&& rhs虽然是右值引用类型,但它是一个有名字的变量。在C++里,任何有名字的变量(哪怕是右值引用类型)在表达式中都会被当作左值处理——因为你能对它取地址,编译器认为它是一个“持久”的对象,而非临时的右值。 - 所以
lhs = rhs;这行代码中,rhs作为左值,会匹配类Person中接受const Person&参数的拷贝赋值运算符,执行拷贝操作。 - 而当你把
rhs强制转换为Person&&时,相当于显式告诉编译器:把这个左值当作右值(将亡值)来处理。此时编译器会匹配接受Person&&参数的移动赋值运算符,执行移动操作。
另外,更规范的写法是使用标准库的std::move函数来完成这个转换,而非C风格强制转换:
lhs = std::move(rhs);
std::move的作用就是将左值转换为右值引用,是C++中触发移动语义的标准方式。
内容的提问来源于stack exchange,提问作者Software Carpenter
相关产品推荐
相关产品推荐

