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
相关产品推荐
相关产品推荐

