C++11 unique_ptr和shared_ptr能够转换为彼此的类型吗?

Does C++11 unique_ptr and shared_ptr able to convert to each other's type?

本文关键字:ptr 类型 unique shared C++11 转换      更新时间:2023-10-16

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

std::unique_ptr是表达独家所有权的C 11的方法,但其中之一是 最有吸引力的功能是它轻松有效地转换为std::shared_ptr

这是std::unique_ptr如此适合作为工厂功能返回类型的关键部分。工厂功能不知道呼叫者是否需要为其返回的对象使用独家所有权语义,或者共享所有权(即std::shared_ptr)是否更合适。通过返回std::unique_ptr,工厂为呼叫者提供了最有效的智能指针,但它们不会阻止呼叫者更弹性更灵活的兄弟姐妹。

std::shared_ptr不允许std::unique_ptr。一旦将资源的一生管理转换为std::shared_ptr,就不会改变主意。即使参考计数是一个,您也无法收回资源的所有权,以便使std::unique_ptr管理它。

参考:有效的现代C 。42个特定方法来改善您对C 11和C 14的使用。斯科特·迈耶斯(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");

我更喜欢这样做。

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

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

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

以另一种方式不切实际。

(正如许多人所指出的那样,这个故事还有更多,值得阅读评论。)