Vous avez deux points douteux dans votre constructeur de copie.
D'abord, vous avez fait le explicite constructeur de copie (ce qui est une chose douteuse à faire), donc vous (en théorie) doivent faire:
Foo d((Foo()));
Deuxièmement, votre constructeur de copie prend référence et non une référence const
ce qui signifie que vous ne pouvez pas l'utiliser avec un Foo
temporaire.
Personnellement, je voudrais simplement supprimer explicit
du constructeur de copie et lui faire prendre une référence const
si possible.
Notez que le explicit
sur votre constructeur par défaut n'a aucun effet. [*] explicit
a seulement un effet sur les constructeurs qui peuvent être appelés avec un seul paramètre. Cela les empêche d'être utilisés pour des conversions implicites. Pour les constructeurs qui prennent seulement zéro ou seulement deux paramètres ou plus, cela n'a aucun effet.
[Note: il peut y avoir une différence entre:.
Foo d;
et
Foo d = Foo();
mais dans ce cas, vous avez un constructeur par défaut déclarée par l'utilisateur si cela ne vaut pas]
Modifier: [*] Je viens de double vérifier cela et 12.3.1 [class.conv.ctor] dit que vous pouvez faire par défaut contre tructor explicit
. Dans ce cas, le constructeur sera utilisé pour initialisation par défaut ou initialisation de la valeur.Pour être honnête, je ne comprends pas la valeur de ceci comme si vous aviez un constructeur déclaré par l'utilisateur alors c'est un type non-POD et même les objets locaux de type non-POD sont initialisés par défaut s'ils n'ont pas d'initialiseur que cette clause dit peut être fait par un constructeur par défaut explicit
. Peut-être que quelqu'un peut signaler un cas de coin où cela fait une différence, mais pour l'instant je ne vois pas quel effet explicit
a sur un constructeur par défaut.
Foo Foo Foo? Huh? –
Le compilateur a déjà répondu à votre question ... 'Foo (const Foo &)'. 'Foo d = Foo();' appelle le constructeur de la copie. –
+1 parce que personne ne semble connaître la réponse –