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 um std::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 um std::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 para std::unique_ptr não é permitido. Depois de passar o gerenciamento vitalício de um recurso para um std::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 um std::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.





unique-ptr