6
votes

Pourquoi initialiser uniques_ptr avec un appel make_unique?

tiré de: http: / /herbstert.com/2013/05/22/gotw-5-solution-overriding-virtual-fonctions/ strong>

Pourquoi devrions-nous écrire: p>

auto pb = make_unique<derived>();


6 commentaires

Erm, pourquoi? Parce que tu veux la première chose et pas la seconde? Ils ne sont pas équivalents. (Vérifier déclinger (pb) )


Une chose est claire ici, si vous avez un smart_pointer de dérivé, vous ne pouvez pas facilement la jeter à la base. parce que contrairement à la base * x; et dérivé * y; Il n'y a pas de relation dans la hiérarchie de type.


Il suffit de vous demander, unique_ptr pb = make_unique (); être plus simple? Parce que auto existe ne signifie pas que nous devons l'utiliser.


@Frederics: Il serait légèrement plus court, plus familier aux personnes qui ne sont pas habituées à C ++ 11 et moins explicites, car cela implique une conversion implicite. Que cela le rend "plus simple" ou non est un jugement esthétique.


J'aime toujours auto pb = unique_ptr (nouveau dérivé ()); pour la clarté.


@Sandernedycker encore mieux avec Uniform-init: {}


3 Réponses :


4
votes
auto pb = make_unique<derived>();

0 commentaires

10
votes

Eh bien, le point est que la première option fait pb A unique_ptr , tandis que la seconde option permet pb A unique_ptr . Si les deux sont corrects ou non dans votre situation dépend de ce que vous avez à voir avec PB - mais les deux ne sont certainement pas équivalents.

Si la partie pertinente de votre programme doit fonctionner avec un < Code> unique_ptr (peut-être parce que plus tard, vous allez le laisser indiquer une instance de la classe dérivée différente différente), la deuxième solution n'est tout simplement pas viable. < / p>

Par exemple: xxx

tandis que: xxx


4 commentaires

@Andyprowl en cache des preuves, sommes-nous?


@Bartekbanachewicz: moi? Je ne ferais jamais ça! (... combien de fois pour supprimer votre commentaire?);)


C ++ est si moche maintenant. Je veux mon Nouveau / Supprimer Retour!


@BoundaryImposition Personne ne les a emmenés. Vous avez simplement des alternatives maintenant.



6
votes

Mes seules devinez que si nous voulons AUTO, nous devons l'aider à déduire le bon type (base ici).

C'est exactement correct. Sans la conversion, pb serait un pointeur sur dérivé qui pourrait ne pas être ce que vous voulez. Par exemple, vous ne pouvez pas le réaffecter à posséder une base ou autre objet de classe dérivée.

Si oui, alors pour moi, cela serait vraiment mérite douteux ..

Je suis enclin à être d'accord. L'auteur note dans un Commentaire qu'il l'a fait parce qu'il aime utiliser le type de déduction du type autant que possible, avec des conversions explicites si nécessaire. Le temps indiquera si ce style devient banal.


1 commentaires

+1 pour le lien vers le commentaire de l'herbe (et votre belle réponse aussi :)