Duplicaté possible: strong>
Pourquoi est-ce une erreur d'utiliser un ensemble de supports vides pour appeler un constructeur sans argument? P>permet de faire ce code p>
xxx pré> alors nous avons des résultats: p>
xxx pré> pouvez-vous expliquer ce qui se passe dans le cas où 3 fort>? p> blockQquote>
6 Réponses :
La troisième ligne est analysée comme déclarant une fonction qui ne prend aucun argument et renvoie un foo code>. p>
foo f3 (); code> déclare une fonction appelée f3 code>, avec un type de retour de foo code>. P>
Ah, bien sûr! J'étais tellement concentré sur les constructeurs ...
Vous avez défini une fonction appelée F3 qui renvoie une FOO au cas 3. Dans le cas 5, vous n'avez aucun constructeur par défaut défini, vous avez donc une erreur. P>
C ++ a une règle selon laquelle si une déclaration peut être interprétée comme une déclaration de fonction, elle est interprétée de cette manière. P>
D'où la syntaxe FOO F3 (); code> déclare réellement une fonction qui ne prend aucun argument et retourne foo code>. Travaillez ceci en écrivant par écrit foo f3; code>, il appellera également le constructeur par défaut (s'il y en a un, bien sûr). P>
F1 code> invoque le constructeur de copie après un appel explicite, vous avez tort sur celui-ci li>
-
f2 code> est un appel de constructeur explicite // vous avez tort ici trop li>
-
f3 code> déclare une fonction li>
-
F4 code> est à nouveau le constructeur de copie, comme F1 code> // Vous êtes ici li>
-
F5 code> appelle le constructeur par défaut // Vous êtes à nouveau ici li>
ul>
foo f6 = 5; code> serait par un appel de constructeur implicite? IIRC.
@Douglas: Oui, ce serait correct.
Ce n'est pas ce que vous pensez que c'est: Vous pouvez penser que c'est un appel explicite du constructeur par défaut, mais ce n'est pas le cas. C'est en fait une déclaration d'une fonction nommée que cela est analysé comme une déclaration de fonction plutôt qu'un appel de constructeur est connu sous le nom de La plupart des paquets vexing . p> p> f3 code> qui ne prend aucun paramètre et renvoie un foo code> par valeur. P>
Non ce n'est pas. Le MVP est lorsque vous fournissez des arguments et cela ressemble toujours à une déclaration de fonction. Ce n'est pas le MVP que ce n'est que le programmeur étant stupide
Recherche: Parse Vexing
@Nim: aurait dû être une réponse.
Notez également que l'exemple 5 fait quel exemple l'exemple 3 à faire et appelle le constructeur par défaut.
@ Björnpollex, récemment, j'ai pris des commentaires avec des termes de recherche appropriés - parfois, c'est juste une question de terminologie manquante, et l'OP peut alors découvrir pour eux-mêmes .. :) De toute façon, je savais que quelqu'un viendrait plus vite avec un vrai réponse.. ;)