为何unique_ptr的reset与operator=功能相近却未重载?
关于unique_ptr的operator=与reset设计疑问
我深知这个问题听起来或许有些奇怪,但我十分好奇:unique_ptr的operator=以右值引用为参数时,会调用reset(r.release())并移动自定义删除器,最终返回*this,伪代码如下:
// 伪代码 unique_ptr& operator=(unique_ptr&& r) { reset(r.release()); // 变更管理的指针 setDeleter(r.getDeleter()); return *this; }
而unique_ptr的reset函数以左值裸指针为参数时,会在变更管理的指针后删除旧指针。二者都具备变更管理指针的行为,且该行为由同一个reset函数处理。除参数差异外,我想不到其他单独的使用场景,因此疑惑能否将二者重载为同名函数,示例伪代码如下:
// 伪代码 unique_ptr& operator=(unique_ptr&& r) // 或者命名为reset { changeManagedPtr(r.release()); // 并删除旧指针 setDeleter(r.getDeleter()); return *this; } unique_ptr& operator=(pointer p) // 或者命名为reset { changeManagedPtr(p); // 并删除旧指针 // 此处p没有删除器,无需调用setDeleter return *this; }
核心疑问
- 为何这两个函数被分开实现而非重载为同名函数?
- 若可行,是否能实现如下更直观的用法:
unique_ptr<int> uniqPtrInt, dest; int* rawPtrInt = new int; dest = rawPtrInt; // 一些操作.. dest = uniqPtrInt;
- 我的假设是否存在错误?是否有我未意识到的稳定性隐患?
内容的提问来源于stack exchange,提问作者Dean Lee
相关产品推荐
相关产品推荐

