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

C++自定义拷贝构造时移动构造显式delete与不声明的差异问题

C++移动构造行为差异问题解答

问题1解答

  • 省略移动构造声明时,A b(std::move(a)) 确实会直接调用拷贝构造,完全符合C++标准。
  • 逻辑和普通函数重载规则完全一致:当类没有声明移动构造函数时,重载决议的候选列表中根本不存在移动构造这一选项。std::move(a)得到的右值可以合法绑定到const A&类型的形参,因此会匹配到拷贝构造函数。

问题2解答

  • 两种情况的核心差异是:显式delete移动构造是「函数存在,但被标记为不可用」;不声明移动构造是「函数根本不存在,不会进入重载候选列表」。
  • 当你显式delete移动构造时,这个函数会进入重载候选集,右值参数优先匹配A&&类型的形参,重载决议会选中这个被删除的函数,直接触发编译报错。
  • 当你不声明移动构造时,由于你已经自定义了拷贝构造函数,编译器不会隐式生成默认移动构造,重载候选列表里没有移动构造这一项,决议会向后匹配到可以接受右值的拷贝构造函数,因此正常执行拷贝逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:36:10