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};
}
有没有办法直接访问raw_pointer
中的unique_ptr
传递给函数foo(cls** pp)
?
或者
cls* raw_ptr = 0;
foo(&raw_ptr);
std::unique_ptr<cls> u_ptr{raw_ptr};
这是唯一的方式吗?
注意:我无法更改函数foo
的签名。
答案 0 :(得分:2)
您可以使用unique_ptr::get()
对unique_ptr
内的指针进行只读访问。这将返回存储指针的副本。
但是,我理解你的问题是,是否有办法在unique_ptr
原位改变指针; 在这里,答案是否 。你必须做你提到的原始到独特的舞蹈。
当然,即使你不能改变foo
的签名,你当然可以提供自己的功能来包裹那个舞蹈。它甚至可能是foo
的重载:
std::unique_ptr<cls> foo()
{
cls *p = nullptr;
foo(&p);
return std::unique_ptr<cls>{p};
}
答案 1 :(得分:-1)
unique_ptr&lt;&gt; :: get() - 它返回一个指向所拥有对象的指针,而不释放该对象的所有权。