You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:54:40