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

为什么返回std::unique_ptr报已删除构造函数错误,返回引用却正常?

返回std::unique_ptr报错原因说明

核心原理

  • std::unique_ptr是C++标准库提供的独占型智能指针,同一时间只能有一个unique_ptr持有对应资源的所有权,为了强制保证独占特性,标准库显式删除了它的拷贝构造函数和拷贝赋值运算符,任何尝试复制unique_ptr的操作都会在编译阶段报错。

代码报错原因

两个函数的行为差异完全符合上述特性:

  1. unique_int GetPtr()函数返回unique_ptr的值类型,执行return p_Int时需要调用拷贝构造函数,用全局变量p_Int复制出一个临时对象作为返回值,刚好调用的是被删除的拷贝构造函数,因此触发编译报错。

你收到的报错信息翻译为:函数std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx>&)[_Ty=int, Dx=std::default_delete<int>](声明在memory库文件第3269行)无法被引用——它是一个已被删除的函数

  1. unique_int& GetPtrAddr()函数返回unique_ptr的左值引用,执行返回操作时只是生成了全局变量p_Int的别名,不会触发unique_ptr对象的拷贝操作,不需要调用被删除的拷贝构造函数,因此可以正常编译运行。

扩展解决方案

如果确实需要通过值返回unique_ptr,可以选择以下两种方案:

  • 转移原有unique_ptr的所有权:将返回语句改为return std::move(p_Int);,执行后全局变量p_Int会变为空指针,所有权转移给返回的临时对象。
  • 函数内部创建临时unique_ptr直接返回:编译器会自动触发返回值优化(RVO),不需要拷贝或者移动操作即可完成返回,无额外性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:48:02