129 votes

Est-ce que C++11 unique_ptr et shared_ptr sont capables de convertir leurs types respectifs ?

La bibliothèque standard C++11 fournit-elle un utilitaire permettant de convertir un fichier de type std::shared_ptr a std::unique_ptr ou vice versa ? Ce fonctionnement est-il sûr ?

0 votes

Définissez la notion de "sécurité", s'il vous plaît. Quel type de sécurité recherchez-vous ? La sécurité de la gestion de la durée de vie ? Sécurité du fil ?

2 votes

"STL" ne signifie pas bibliothèque standard. La STL n'a rien à voir avec shared_ptr .

1 votes

@jaggedSpire La sécurité des threads signifie que les propriétaires sont utilisés dans différents threads, c'est-à-dire que le nombre d'utilisations n'est pas égal à 1.

221voto

chema989 Points 1964

std::unique_ptr est la façon C++11 d'exprimer la propriété exclusive, mais l'une de ses caractéristiques les plus attrayantes est la conversion facile et efficace en une propriété exclusive. l'une de ses caractéristiques les plus attrayantes est qu'elle se convertit facilement et efficacement en une méthode d'expression de la propriété exclusive. std::shared_ptr .

C'est une des raisons principales pour lesquelles std::unique_ptr est si bien adapté comme type de retour de fonction d'usine. Les fonctions d'usine ne peuvent pas savoir si les appelants voudront utiliser la sémantique de propriété exclusive pour l'objet qu'elles retournent ou si la propriété partagée (c'est-à-dire, std::shared_ptr ) serait plus approprié. En renvoyant un std::unique_ptr Les usines de production d'énergie fournissent aux appelants le pointeur intelligent le plus efficace, mais elles n'empêchent pas les appelants de le remplacer par son frère plus flexible.

std::shared_ptr a std::unique_ptr n'est pas autorisé. Une fois que vous avez confié la gestion de la durée de vie d'une ressource à une équipe de gestion des ressources. std::shared_ptr il n'est pas possible de changer d'avis. Même si le nombre de références est de un, vous ne pouvez pas récupérer la propriété de la ressource afin, par exemple, d'avoir un std::unique_ptr le gérer.

Référence : Effective Modern C++. 42 FAÇONS SPÉCIFIQUES D'AMÉLIORER VOTRE UTILISATION DE C++11 ET C++14. Scott Meyers.

En bref, vous pouvez facilement et efficacement convertir une std::unique_ptr a std::shared_ptr mais vous ne pouvez pas convertir std::shared_ptr a 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");

0 votes

Sachez que, bien que cela ne soit pas autorisé, le compilateur (du moins pas gcc) va en fait no empêcher (ou même avertir) si vous affectez accidentellement (par exemple en changeant le type de pointeur d'une variable membre) une variable de type std::unique_ptr à un std::shared_ptr .

0 votes

3 votes

@StefanQ Qu'est-ce qui vous fait penser qu'il n'est pas permis d'assigner une std::unique_ptr en un std::shared_ptr ? La bibliothèque standard définit un opérateur d'assignation de déplacement template<class Y, class Deleter> shared_ptr& operator=(std::unique_ptr<Y, Deleter>&& r); pour std::shared_ptr<T> .

0voto

Je préfère le faire.

std::unique_ptr<int> up_ = std::make_unique<int>();
std::shared_ptr<int> sp_ = std::move(up_);

-10voto

nmr Points 5504

Pour un tronc unique u_ptr, créer un tronc partagé s_ptr :

std::shared_ptr<whatever> s_ptr(u_ptr.release());

Aller dans l'autre sens n'est pas pratique.

34 votes

Voici la "bonne" façon : std::shared_ptr<whatever> s_ptr(std::move(u_ptr));

12 votes

Et voici la "bonne" manière pédante : std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};

0 votes

@polyvertex : y a-t-il une différence réelle entre ces deux syntaxes dans ce cas particulier ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X