web-dev-qa-db-fra.com

C ++ 11 unique_ptr et shared_ptr sont-ils capables de convertir leurs types respectifs?

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?

72
Hind Forsum

_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");
_
117
chema989