关于Move semantics与std::move的疑问:两种场景下移动构造函数为何执行不同?
问题解析:两种
showMe调用的移动构造行为差异 第一种场景(右值引用参数):无移动构造的原因
当showMe的参数是Test&& test时,这个参数是右值引用——它的作用是直接绑定到你传入的右值(std::move(test1)把原对象test1转换成了右值类型)。这个绑定过程只是给原对象test1新增了一个"右值视角的别名",完全不需要创建新的Test对象。
所以函数里访问的test.value本质就是原test1的成员,全程只有一开始创建test1时的默认构造日志,自然不会触发移动构造函数。
第二种场景(值传递参数):触发移动构造的原因
当showMe的参数是Test test时,这是值传递规则:函数调用时必须创建一个全新的Test对象作为函数的形参。
此时你传入的是std::move(test1)生成的右值,编译器会优先选择移动构造函数来初始化这个新的形参对象——通过移动原对象test1的资源来创建新对象,所以会输出"Move Constructed"的日志。
核心差异总结
- 右值引用参数:仅绑定已存在的对象,不产生新对象,因此不会触发任何构造函数;
- 值传递参数:必须创建新对象,当传入右值时,会通过移动构造来生成这个新对象。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

