CppCoreGuidelines R33 为什么通过引用传递 `unique_ptr`?

CppCoreGuidlines R.33 Why pass `unique_ptr` by reference?

CppCoreGuidlines rule R.33建议

Take a unique_ptr<widget>& parameter to express that a function reseats the widget.

Reason Using unique_ptr in this way both documents and enforces the function call’s reseating semantics.

Note “reseat” means “making a pointer or a smart pointer refer to a different object.”

我不明白当reseat意味着“使指针或智能指针引用不同的对象时,为什么我们应该通过引用传递。”

当函数的目的是 reseat/change 指针指向的底层对象时,我们不是以这种方式从调用者那里窃取所有权,因此应该按值传递 unique_ptr,因此移动它并转移所有权?

是否有示例可以解释为什么建议通过引用传递 unique_ptr

When the function's purpose is to reseat/change the underlying object the pointer is pointing to, aren't we stealing the ownership from the caller this way

没有。无论是当我们“重新设置”一个指针时,还是当我们更改指向的对象时,我们都没有获得指针的所有权,即我们没有转移所有权。

Is there an example that explains why passing a unique_ptr by reference is recommended?

下面是一个“重置”唯一指针的函数示例:

void reseat(std::unique_ptr<widget>& ptr) {
    ptr = std::make_unique<widget>();
}

如果您尝试使用对 const 的引用,那将根本无法编译。如果您尝试使用非引用参数,则参数指针不会被修改,因此行为不会如您所愿。调用者将被迫移动他们的指针,使其始终为空。

您可以修改示例以使用指向唯一指针的指针,但建议使用引用,因为不可能错误地传递 null。参考包装器也可以工作,但它会不必要地复杂。

In case we make it point somewhere else, what happens to the object it pointed before?

如果唯一指针指向非空的对象,那么将其指向其他地方将导致删除先前指向的对象。

Aren't we leaking memory in this case?

没有


注意,为了便于理解,示例比较简单。通常我不建议编写这样的函数,而是考虑编写一个 returns 新的唯一指针的函数,并让调用者自己“重新设置”指针。但这要看细节。