La bibliothèque standard C ++ 11 fournit-elle un utilitaire permettant de convertir un std::shared_ptr
en std::shared_ptr
std::unique_ptr
, ou inversement? Est-ce une opération sûre?
std::unique_ptr
est le moyen d’exprimer la propriété exclusive de C ++ 11, mais l’une de ses fonctionnalités les plus intéressantes est qu’il convertit facilement et efficacement enstd::shared_ptr
.Ceci est un élément clé de la raison pour laquelle
std::unique_ptr
est si bien adapté en tant que type de retour de fonction usine. Les fonctions d’usine ne peuvent pas savoir si les appelants voudront utiliser la sémantique de propriété exclusive pour l’object qu’ils renvoient ou si la propriété partagée (par exemple,std::shared_ptr
) serait plus appropriée. En renvoyant unstd::unique_ptr
, les usines fournissent aux appelants le pointeur intelligent le plus efficace, mais ils n’empêchent pas les appelants de le remplacer par un frère plus flexible.
std::shared_ptr
àstd::unique_ptr
n’est pas autorisé. Une fois que vous avez transformé la gestion à vie d’une ressource enstd::shared_ptr
, vous ne changez pas d’avis. Même si le compte de référence est un, vous ne pouvez pas récupérer la propriété de la ressource pour, par exemple, avoir unstd::unique_ptr
gérer.Référence: Effective Modern C ++. 42 FAÇONS SPÉCIFIQUES D’AMÉLIORER VOTRE UTILISATION DE C ++ 11 ET DE C ++ 14. Scott Meyers.
En bref, vous pouvez convertir facilement et efficacement 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 unique = std::make_unique ("test"); std::shared_ptr shared = std::move(unique);
ou:
std::shared_ptr shared = std::make_unique ("test");
Étant donné unique_ptr u_ptr, créez shared_ptr s_ptr:
std::shared_ptr s_ptr(u_ptr.release());
Aller dans l’autre sens est impraticable.