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

Hin*_*sum 79 c++ shared-ptr unique-ptr c++11

难道C++ 11标准库提供任何实用程序从一个转换std::shared_ptrstd::unique_ptr,或反之亦然?这是安全的操作吗?

che*_*989 132

std::unique_ptr是C++ 11表达独家所有权的方式,但其最吸引人的特点之一是它可以轻松高效地转换为std::shared_ptr.

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

std::shared_ptrstd::unique_ptr是不允许的.一旦您将资源的生命周期管理转变为a std::shared_ptr,就不会改变主意.即使引用计数为1,也不能回收资源的所有权,以便std::unique_ptr管理它.

参考:有效的现代C++.42提高您使用C++ 11和C++ 14的具体方法.斯科特迈耶斯.

简而言之,您可以轻松高效地转换std::unique_ptrstd::shared_ptr但无法转换std::shared_ptrstd::unique_ptr.

例如:

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
Run Code Online (Sandbox Code Playgroud)

要么:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
Run Code Online (Sandbox Code Playgroud)

  • ...你怎么做呢? (6认同)
  • @杰克我加了一个例子 (2认同)
  • @StefanQ是什么让你认为不允许将`std::unique_ptr`分配给`std::shared_ptr`?标准库为 `std::shared_ptr&lt;T&gt;` 定义了一个移动赋值运算符 `template&lt;class Y, class Deleter&gt; shared_ptr&amp; operator=(std::unique_ptr&lt;Y, Deleter&gt;&amp;&amp; r);`。 (2认同)