8
votes

C ++ COPY-CONSTRUCTION DE CONSTRUCTION ET ASSIGNER QUESTION

Voici un extrait de l'article 56 du livre "C ++ Gotchas":

Il est pas rare de voir d'un simple l'initialisation d'un objet Y écrit de trois manières différentes, comme si ils étaient équivalents. p> Blockquote>

Constructing Widget a

Copy constructing Widget from a

Constructing Widget c
Assigning Widget from a to c

Copy constructing Widget from a

Constructing Widget e

Constructing Widget f
Copy constructing Widget from f


3 commentaires

"Dans le cas de l'initialisation de B, nous demandons la création d'un temporaire anonyme de type Y, initialisé avec la valeur 1066" ... et la même chose dans l'initialisation de C, il est tout simplement plus difficile de voir le temporaire.


Notez que y c = 1006 n'est pas possible si votre constructeur est déclaré comme explicite ... comme tout constructeur de paramètres devrait, la plupart du temps.


Matthieu, oui je suis d'accord avec ce que vous avez dit et je le fais toujours quand la programmation. Votre point est également couvert dans le livre "plus efficace C ++" si je me souviens bien.


3 Réponses :


6
votes

Le compilateur est autorisé à optimiser les cas B et C pour être identique au A . En outre, les appels de construction et d'attribution de copie peuvent être entièrement éliminés par le compilateur de toute façon, de sorte que tout ce que vous voyez n'est pas nécessairement le même avec différents compilateurs ou même des paramètres du compilateur.


5 commentaires

Cela signifie donc que le livre peut ne pas être correct à 100% maintenant? Intéressant.


@Andy, aucun livre n'est 100% correct. Mais ce n'est pas complet à 100%. Si vous souhaitez achever 100%, vous devez consulter la norme. Spécifiquement, il (ou la partie que vous avez citée) n'explique pas que le compilateur est autorisé à optimiser des copies si la copie est effectuée à partir d'un temporaire ci-dessus.


Merci. Je suppose que vous devriez toujours utiliser les formats suggérés par le livre, dans le cas où le compilateur que vous utilisez ne met pas en œuvre l'optimisation.


Non tu ne devrais pas. Utilisez ce qui est plus clair et ne vous inquiétez pas de ces optimisations mineures.


@Johannes: "Le livre dit la vérité, et rien que la vérité, mais pas toute la vérité." :)



16
votes

La syntaxe xxx

où A et B sont de type x ont toujours signifié la construction de la copie. Quelles que soient les variantes, telles que: xxx

sont utilisées, il n'y a pas d'affectation en cours et n'a jamais été. Construire et assigner serait quelque chose comme: xxx


1 commentaires

Merci pour le commentaire sur la construction de la copie. Je n'étais pas vraiment au courant de cela - j'ai toujours pensé que vous deviez faire x = A (b); Assurez-vous d'invoquer le constructeur de copie.



3
votes

à partir de C ++ 17, tous les trois sont équivalents (sauf si y :: y (int) est explicite , lequel refuserait simplement C ) en raison de ce que l'on appelle souvent copie obligatoire Elision .

même y c = 1066; ne crée que l'objet y car le résultat de la conversion implicite sur y est une prvalue qui est utilisé pour initialiser c plutôt que de créer un temporaire.


0 commentaires