C + + 11 only_ptr 和 share_ptr 能够转换成对方的类型吗?

C + + 11标准库是否提供了将 std::shared_ptr转换为 std::unique_ptr的实用程序,或者反之亦然?这次行动安全吗?

101849 次浏览

std::unique_ptr是 C + + 11表示独占所有权的方式之一,但它的 最吸引人的特点是,它很容易和有效地转换为一个 std::shared_ptr

这是 std::unique_ptr非常适合作为工厂函数返回类型的关键部分。工厂函数不能知道调用方是否希望对它们返回的对象使用独占所有权语义,或者共享所有权(即 std::shared_ptr)是否更合适。通过返回一个 std::unique_ptr,工厂为来电者提供了最有效的智能指针,但是他们并不妨碍来电者用它更灵活的兄弟替换它。

不允许从 std::shared_ptrstd::unique_ptr。一旦您将资源的生命周期管理移交给 std::shared_ptr,您的想法就不会改变。即使引用计数为1,您也不能回收资源的所有权,以便让一个 std::unique_ptr来管理它。

参考文献: 有效的现代 C + + 。提高 C + + 11和 C + + 14使用的42种具体方法。

简而言之,您可以轻松有效地将 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");

如果给定 only _ ptr u _ ptr,则创建 share _ ptr s _ ptr:

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

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

我更愿意这么做。

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