Czy biblioteka standardowa C ++ 11 zapewnia narzędzie do konwersji z formatu a std::shared_ptr
na std::unique_ptr
lub odwrotnie? Czy to bezpieczna operacja?
c++
c++11
shared-ptr
unique-ptr
Hind Forsum
źródło
źródło
shared_ptr
.Odpowiedzi:
Krótko mówiąc, możesz łatwo i efektywnie przekonwertować
std::unique_ptr
na,std::shared_ptr
ale nie możesz przekonwertowaćstd::shared_ptr
nastd::unique_ptr
.Na przykład:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test"); std::shared_ptr<std::string> shared = std::move(unique);
lub:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
źródło
std::unique_ptr
do astd::shared_ptr
.std::unique_ptr
do astd::shared_ptr
? Biblioteka standardowa definiuje operator przypisania przenoszeniatemplate<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r);
dlastd::shared_ptr<T>
.Biorąc pod uwagę unique_ptr u_ptr, utwórz shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Odwrotna droga jest niepraktyczna.
źródło
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
przechowywane wunique_ptr