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

为何使用非const拷贝构造函数时编译器会报错?

为什么非const引用的拷贝构造函数无法处理临时对象?

嗨,我来帮你把这个问题讲明白,核心原因其实和C++里左值、右值的引用绑定规则直接相关:

  • 先看你代码里的ABC c1 = ABC();:这里的ABC()是一个临时对象,属于C++中的「右值」——它没有自己的名字,创建后很快就会被销毁,程序里没法直接去修改它。
  • 你最初写的拷贝构造函数是ABC(ABC& a),参数是非const的左值引用。C++的规则明确禁止这种引用绑定到右值:因为右值是临时的,允许修改它不仅没有实际意义(改完就没了),还很可能是程序员的误操作,所以编译器直接抛出错误阻止你这么做。
  • 当你把拷贝构造函数改成ABC(const ABC& a)后,参数变成了const左值引用。C++专门允许const引用绑定到右值,因为const关键字保证了你不会去修改这个临时对象,用它来初始化新对象完全合理——编译器会把临时对象绑定到这个const引用参数上,顺利执行拷贝构造逻辑。

另外补充个小知识点:其实ABC c1 = ABC();这种写法,有些编译器会触发**复制消除(copy elision)**优化,直接跳过拷贝构造步骤,直接构造c1。但即使有这个优化,编译器还是会先检查拷贝构造函数是否合法可访问,所以你的原代码还是会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:42:56