如何为含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>类型
目前我有两种可行方案,但从可读性角度看都不完善:
移除const限定符:
std::unique_ptr<int> ptr_;问题:会让使用者误解为「调用公共方法时可能修改ptr_成员」
改为shared_ptr:
const std::shared_ptr<int> ptr_;问题:会让使用者误解为「存在多个指向同一数据的指针」
是否有更优设计方案,可避免上述两种方案的问题?
内容的提问来源于stack exchange,提问作者mercury0114
相关产品推荐
相关产品推荐

