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

如何为含const std::unique_ptr成员的类设计支持移动的单构造函数

const unique_ptr成员类的移动构造问题

以下是简化后的测试代码:

class Class {
 public:
     Class(std::unique_ptr<int>&& ptr): ptr_(std::move(ptr)) {}
 private:
     // 仅改为std::shared_ptr或移除const限定符时可行
     const std::unique_ptr<int> ptr_;
};

int main() {
  std::unique_ptr<int> ptr = std::make_unique<int>(1);
  Class c(std::move(ptr)); // 编译通过
  // 我需要构造新实例d,不再需要c,可清空c的所有资源
  Class d(std::move(c)); // 编译失败
  return 0;
}

编译时出现错误:

Copy constructor of 'Class' is implicitly deleted because field 'ptr_' has a deleted copy constructor

编辑补充:使用std::move(c)构造实例d时同样失败,报错信息如下:

class.cc:17:23: error: use of deleted function ‘Class::Class(Class&&)’
17 | Class d(std::move(c));
| ^
class.cc:5:7: note: ‘Class::Class(Class&&)’ is implicitly deleted because the default definition would be ill-formed:

但如果将ptr_改为const std::shared_ptr<int>类型,代码就能正常编译。

我需要为Class设计单个构造函数,满足以下需求:

  • 直接传入所需参数构造类实例
  • 从另一个类实例构造新实例,过程中可以销毁原实例(如Class d(std::move(c)))
  • 类成员必须是const std::unique_ptr<int>类型

目前我有两种可行方案,但从可读性角度看都不完善:

  1. 移除const限定符:

    std::unique_ptr<int> ptr_;
    

    问题:会让使用者误解为「调用公共方法时可能修改ptr_成员」

  2. 改为shared_ptr:

    const std::shared_ptr<int> ptr_;
    

    问题:会让使用者误解为「存在多个指向同一数据的指针」

是否有更优设计方案,可避免上述两种方案的问题?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:05:14