La bibliothèque standard C++ 11 fournit-elle un utilitaire permettant de convertir un std::shared_ptr
en std::unique_ptr
, ou inversement? Est-ce que cette opération est sécuritaire?
_
std::unique_ptr
_ est le moyen C++ 11 d'exprimer la propriété exclusive, mais l'une de ses caractéristiques les plus attrayantes est qu'il convertit facilement et efficacement en un _std::shared_ptr
_.Ceci explique en partie pourquoi _
std::unique_ptr
_ convient si bien comme type de retour de fonction usine. Les fonctions d’usine ne peuvent pas savoir si les appelants souhaitent utiliser la sémantique de propriété exclusive pour l’objet qu’elles renvoient ou si la propriété partagée (c’est-à-dire _std::shared_ptr
_) serait plus appropriée. En renvoyant un _std::unique_ptr
_, les usines fournissent aux appelants le pointeur intelligent le plus efficace, mais n'empêchent pas les appelants de le remplacer par son frère plus flexible._
std::shared_ptr
_ à _std::unique_ptr
_ n'est pas autorisé. Une fois que vous avez transféré la gestion de la durée de vie d’une ressource à un _std::shared_ptr
_, vous ne changez pas d’avis. Même si le nombre de références est égal à un, vous ne pouvez pas récupérer la propriété de la ressource pour, par exemple, le faire gérer par un _std::unique_ptr
_.Référence: Effective Modern C++. 42 MOYENS SPÉCIFIQUES D'AMÉLIORER VOTRE UTILISATION DE C++ 11 ET C++ 14. Scott Meyers.
En bref, vous pouvez facilement et efficacement convertir un _std::unique_ptr
_ en _std::shared_ptr
_ mais vous ne pouvez pas convertir _std::shared_ptr
_ en _std::unique_ptr
_.
Par exemple:
_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");
_