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

右值引用作为参数会调用移动构造吗?代码运行异常疑问

为什么移动构造函数未被调用?

你的代码里移动构造函数没触发,核心原因是**func的参数是右值引用类型A&&,传递右值/转换后的右值时只是引用绑定,不会触发对象的构造(包括移动构造)**。

我们逐行拆解main里的执行逻辑:

  • A a;:直接构造对象a,触发默认构造函数,输出第一次Default Constructor。
  • func(std::move(a));:std::move(a)仅将左值a转换为右值引用类型,并未创建新的A对象。func的参数A&& a直接绑定到这个转换后的右值引用上,全程没有新对象初始化,自然不会调用移动构造函数。
  • func(A());:A()会创建一个临时A对象,这个过程触发默认构造函数,输出第二次Default Constructor。随后这个临时对象作为右值,直接绑定到func的A&&参数上,同样没有新对象需要构造,因此也不会调用移动构造。

如果想要触发移动构造函数,需要在func内部用传入的右值引用初始化新的A对象,比如修改func为:

void func(A&& a) {
    A b = std::move(a); // 此处会调用移动构造函数
}

此时运行代码,输出就会包含Move Constructor了。

另外你提到“为了避免编译器优化而定义赋值运算符”,但当前场景和赋值逻辑无关,问题出在引用绑定的机制上,和编译器优化没有关系。

内容的提问来源于stack exchange,提问作者Danil Hu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:12:11