为什么unique_ptr有两个函数reset和operator=,它们做类似的事情但不重载?

Dea*_*Lee 2 c++ smart-pointers unique-ptr c++11 c++14

我知道这听起来像是一个奇怪的问题,但我很好奇。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 = new int;
dest = rawPtrInt;
// some work..
dest = uniqPtrInt;
Run Code Online (Sandbox Code Playgroud)

我假设有什么问题吗?是否有任何我不知道的稳定性影响?

Cal*_*eth 7

unique_ptr& unique_ptr::operator=(pointer p)可以实施,但委员会选择不实施,原因与他们unique_ptr::unique_ptr(pointer p)明确指出的相同。

唯一的指针代表对象的唯一所有权。如果您可以从原始指针隐式构造或分配它们,则很容易意外转移所有权(并且,没有意识到您已经转移了所有权,做了一些未定义行为的事情,例如双重删除)。