O C++ 11 unique_ptr e shared_ptr conseguem converter no tipo um do outro?
c++11 shared-ptr (2)
std::unique_ptr
é a maneira C ++ 11 de expressar propriedade exclusiva, mas um de seus recursos mais atraentes é que ele converte de maneira fácil e eficiente em umstd::shared_ptr
.Essa é uma parte importante do motivo pelo qual
std::unique_ptr
é tão adequado como um tipo de retorno de função de fábrica. As funções de fábrica não sabem se os chamadores desejam usar a semântica de propriedade exclusiva para o objeto que retornam ou se a propriedade compartilhada (por exemplo,std::shared_ptr
) seria mais apropriada. Ao retornar umstd::unique_ptr
, as fábricas fornecem aos chamadores o ponteiro inteligente mais eficiente, mas eles não impedem os chamadores de substituí-lo por seu irmão mais flexível.
std::shared_ptr
parastd::unique_ptr
não é permitido. Depois de passar o gerenciamento vitalício de um recurso para umstd::shared_ptr
, não há como mudar de idéia. Mesmo que a contagem de referência seja uma, você não pode recuperar a propriedade do recurso para, digamos, ter umstd::unique_ptr
gerenciando-o.Referência: C ++ moderno eficaz. 42 MANEIRAS ESPECÍFICAS DE MELHORAR O USO DE C ++ 11 E C ++ 14. Scott Meyers.
Em resumo, você pode converter de forma fácil e eficiente um
std::unique_ptr
em
std::shared_ptr
mas não é possível converter
std::shared_ptr
em
std::unique_ptr
.
Por exemplo:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
ou:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
A biblioteca padrão do C ++ 11 fornece qualquer utilitário para converter de um
std::shared_ptr
para
std::unique_ptr
ou vice-versa?
Esta operação é segura?
Dado unique_ptr u_ptr, crie shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Indo para o outro lado é impraticável.