Pourquoi devrions-nous écrire: p> auto pb = make_unique<derived>();
3 Réponses :
auto pb = make_unique<derived>();
Eh bien, le point est que la première option fait Si la partie pertinente de votre programme doit fonctionner avec un < Code> unique_ptr Par exemple: p> tandis que: p> pb code> A
unique_ptr
pb code> A
unique_ptr
PB code> - mais les deux ne sont certainement pas équivalents.
@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 code> /
Supprimer code> Retour!
@BoundaryImposition Personne ne les a emmenés. Vous avez simplement des alternatives maintenant.
Mes seules devinez que si nous voulons AUTO, nous devons l'aider à déduire le bon type (base ici). P> blockQuote>
C'est exactement correct. Sans la conversion,
pb code> serait un pointeur sur
dérivé code> qui pourrait ne pas être ce que vous voulez. Par exemple, vous ne pouvez pas le réaffecter à posséder une base code> code> ou autre objet de classe dérivée. P>
Si oui, alors pour moi, cela serait vraiment mérite douteux .. p> blockQuote>
Je suis enclin à être d'accord. L'auteur note dans un Commentaire a> 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. P>
+1 pour le lien vers le commentaire de l'herbe (et votre belle réponse aussi :)
Erm, pourquoi? Parce que tu veux la première chose et pas la seconde? Ils ne sont pas équivalents. (Vérifier
déclinger (pb) code>)
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 (); code> être plus simple? Parce que
auto code> 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é ()); code> pour la clarté.
@Sandernedycker encore mieux avec Uniform-init:
{} code>