std::unique_ptr 作为函数的输出参数

std::unique_ptr as out argument to a function

struct cls{
    ~cls(){std::cout<<"dtor\n";}
};

void foo(cls** pp){
    *pp = new cls;
}

int main()
{
    cls* raw_ptr = 0;    
    foo(&raw_ptr);
    std::unique_ptr<cls> u_ptr{raw_ptr};
}

有没有办法直接访问unique_ptr中的raw_pointer传递给函数foo(cls** pp)

cls* raw_ptr = 0;    
foo(&raw_ptr);
std::unique_ptr<cls> u_ptr{raw_ptr};

这是唯一的方法吗?

注意:我无法更改函数的签名 foo

unique_ptr<>::get() - 它 returns 指向拥有对象的指针,而不释放对象的所有权。

您可以只读 访问unique_ptr 中的指针,方法是使用unique_ptr::get()。这returns 存储了指针的副本。

但是,我理解你的问题,关于是否有办法在 unique_ptr 原位; 中改变指针,答案是 没有。你必须做你提到的原始到独特的舞蹈。

当然,即使你不能更改foo的签名,你当然可以提供自己的功能来包裹那支舞。它甚至可能是 foo:

的重载
std::unique_ptr<cls> foo()
{
  cls *p = nullptr;
  foo(&p);
  return std::unique_ptr<cls>{p};
}

[Live example]