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

新手上路,请多包涵

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

原文由 Hind Forsum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 877
2 个回答

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 种特定方法。斯科特迈耶斯。

In short, you can easily and efficiently convert a std::unique_ptr to std::shared_ptr but you cannot convert std::shared_ptr to 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");

原文由 chema989 发布,翻译遵循 CC BY-SA 4.0 许可协议

我更愿意这样做。

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

原文由 pkthapa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题