Est-ce que C ++ 11 unique_ptr et shared_ptr est capable de se convertir les uns aux autres?

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 en std::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 un std::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 en std::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 un std::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.