Does C++11 standard library provide any utility to convert from a std::shared_ptr to std::unique_ptr, or vice versa? Is this safe operation?
std::unique_ptris the C++11 way to express exclusive ownership, but one of its most attractive features is that it easily and efficiently converts to astd::shared_ptr.This is a key part of why
std::unique_ptris so well suited as a factory function return type. Factory functions can’t know whether callers will want to use exclusive ownership semantics for the object they return or whether shared ownership (i.e.,std::shared_ptr) would be more appropriate. By returning astd::unique_ptr, factories provide callers with the most efficient smart pointer, but they don’t hinder callers from replacing it with its more flexible sibling.
std::shared_ptrtostd::unique_ptris not allowed. Once you’ve turned lifetime management of a resource over to astd::shared_ptr, there’s no changing your mind. Even if the reference count is one, you can’t reclaim ownership of the resource in order to, say, have astd::unique_ptrmanage it.Reference: Effective Modern C++. 42 SPECIFIC WAYS TO IMPROVE YOUR USE OF C++11 AND C++14. Scott Meyers.
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.
For example:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
or:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
Given unique_ptr u_ptr, create shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Going the other way is impractical.
来源:https://stackoverflow.com/questions/37884728/does-c11-unique-ptr-and-shared-ptr-able-to-convert-to-each-others-type