C++11 unique_ptr和shared_ptr可以互相转换类型吗?

o75abkj4  于 2023-04-13  发布在  其他
关注(0)|答案(4)|浏览(266)

C++11标准库是否提供任何实用程序来从std::shared_ptr转换为std::unique_ptr,反之亦然?这种操作安全吗?

rqqzpn5f

rqqzpn5f1#

std::unique_ptr是C11表示独占所有权的方式,但它最吸引人的特性之一是它可以轻松有效地转换为std::shared_ptr
这就是为什么std::unique_ptr非常适合作为工厂函数返回类型的关键部分。通过返回一个std::unique_ptr,工厂为调用者提供了最有效的智能指针,但它们并不妨碍调用者将其替换为更灵活的同级。
std::shared_ptrstd::unique_ptr是不允许的。一旦你把资源的生命周期管理交给了std::shared_ptr,你就不会改变主意了。即使引用计数是1,你也不能收回资源的所有权,比如说,让std::unique_ptr来管理它。
参考:Effective Modern C
. 42 Specific WAYS TO IMPROVE YOUR USE OF C11 AND C14. Scott Meyers.
简而言之,您可以轻松高效地将std::unique_ptr转换为std::shared_ptr,但无法将std::shared_ptr转换为std::unique_ptr
例如:

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);

或:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
qhhrdooz

qhhrdooz2#

我宁愿这样做。

std::unique_ptr<int> up_ = std::make_unique<int>();
std::shared_ptr<int> sp_ = std::move(up_);
ni65a41a

ni65a41a3#

我觉得这个问题和答案非常有用。
我一直在寻找std::unique_ptr的合理用法。
现在我知道了,它非常适合作为工厂返回类型。
多谢了!

mdfafbf1

mdfafbf14#

给定unique_ptr u_ptr,创建共享_ptr s_ptr:

std::shared_ptr<whatever> s_ptr(u_ptr.release());

走另一条路是不切实际的。

相关问题