函数返回的临时unique_ptr句柄

A handle to temporary unique_ptr returned by function

本文关键字:ptr 句柄 unique 返回 函数      更新时间:2023-10-16

我试图阅读一些关于对象所有权的文章,以及在复制构造本质上是被禁止的unique_ptr时如何应用一些例外。当然,我通过并通过引用返回它,因此不必涉及复制。

std::unique_ptr<T>& ptr_func(std::unique_ptr<T>& p) {
return p;
}

将指针的实例传递给此函数是没有问题的。它基本上进入函数并保持不变,无论它指向什么。

现在我的问题来了:假设我的兴趣指针指向一个包含多个属性的对象,而我只能以函数的返回值的形式检索该指针,例如

std::unique_ptr<T>& ptr_func() //say this function returns my pointer.

现在,假设检索这个指针需要相当多的计算(例如,通过迭代一个大向量(,我想设置/获取它指向的对象的许多不同的属性。然后,不能对它指向的指针或对象使用第二个(临时(句柄变得非常不切实际,因为我必须为每个操作调用返回指针的函数。编译器确实在一种已知情况下以某种方式创建了第二个引用:假设我将返回指针的函数作为参数传递给另一个函数,该函数更改了所指向对象的属性:

void set_attributes(std::unique_ptr ptr) {
ptr->change_something();
ptr->change_something_else();
}

这样:

void set_attributes(function_returning_pointer())

在这种情况下,function_returning_pointer((只调用一次,无论它的返回值在set_attributes((的主体中使用了多少次,这是如何工作的?

std::unique_ptr<T>& ptr_func()是一个奇怪的签名:你可能会拥有所有权......或不。

您可能想要更清晰的功能:

T& get_ref();
T* get_ptr();
std::unique_ptr<T> take();

从您的使用情况来看,set_attributes应该是:

void set_attributes(MyObject& ptr) {
ptr.change_something();
ptr.change_something_else();
}

用法类似于

assert(function_returning_pointer() != nullptr);
set_attributes(*function_returning_pointer());
assert(get_ptr() != nullptr);
set_attributes(*get_ptr());
set_attributes(get_ref());
auto ptr = take();
assert(ptr != nullptr);
set_attributes(*ptr); // set_attributes(*take()) would be useless as object would be destroyed.

如果您真的想在不转让所有权的情况下继续传递unique_ptr,您的方法是:

void set_attributes(std::unique_ptr<MyObject>& ptr) { // prefer MyObject& or MyObject* instead
assert(ptr != nullptr);
ptr->change_something();
ptr->change_something_else();
}