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

C++用函数返回值初始化对象报错与拷贝构造函数有关是什么原因

错误原因说明

核心问题出在你自定义的拷贝构造函数的参数类型不符合C++的引用绑定规则:

  • 你写的拷贝构造函数参数是MyInt&,属于非const左值引用,C++语法明确禁止非const左值引用绑定到右值(临时对象)。

两种初始化场景的差异

  • 直接用ob1初始化ob2时:ob1是有明确内存地址、生命周期持久的左值,非const左值引用可以正常绑定,因此调用拷贝构造没有问题。
  • 用func()返回值初始化ob2时:func按值返回的MyInt对象是临时对象,属于右值,无法被非const左值引用绑定,因此触发报错。

额外说明:即使开启编译器的复制消除优化省略返回值拷贝步骤,C++语法层面仍然要求该场景下拷贝构造必须是可调用的,因此参数不合法的错误仍然会抛出。

修复方案

最通用的修复方式是将拷贝构造函数的参数改为const MyInt&(const左值引用,C++允许const左值引用绑定到右值),这也是标准拷贝构造函数的规范写法:

// 修改后的拷贝构造函数
MyInt(const MyInt& obj) {
    this->x = obj.x;
    cout<< "copy constructor called" << endl;
}

如果使用C++11及以上版本,也可以额外补充移动构造函数处理右值场景,进一步优化性能,但修改拷贝构造参数加const是优先级最高的通用解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:27:01