我知道这听起来像是一个奇怪的问题,但我很好奇。unique_ptr运算符=将右值引用作为参数并调用reset(r.release()),然后移动自定义删除器。最后,运算符返回*this。喜欢:
// this is pseudo code
unique_ptr& operator=(unique_ptr&& r)
{
reset(r.release()); // Change managed pointer
setDeleter(r.getDeleter());
return *this;
}
Run Code Online (Sandbox Code Playgroud)
unique_ptr重置函数以左值原始指针作为参数,并在更改其管理的指针后删除旧指针。在两者之间,它们具有相同的更改所管理的指针的行为。该行为由相同的 reset() 函数处理。这两个函数做类似的事情,除了参数的差异之外,我想不出一个单独的用例,所以我想知道是否可以重载它们。喜欢:
// this is pseudo code
unique_ptr& operator=(unique_ptr&& r) // or a function named reset
{
changeManagedPtr(r.release()); // and delete old pointer
setDeleter(r.getDeleter());
return *this;
}
unique_ptr& operator=(pointer p) // or a function named reset
{
changeManagedPtr(p); // and delete old pointer
// setDeleter(r.getDeleter()); there is no deleter in p
return *this;
}
Run Code Online (Sandbox Code Playgroud)
为什么这两个函数要分开编写而不是作为同名的重载函数呢?如果可能的话,是不是可以使用像这样不那么混乱的东西:
unique_ptr<int> uniqPtrInt, dest;
int* rawPtrInt …Run Code Online (Sandbox Code Playgroud)