11
votes

Constructeur Spooky C ++

Duplicaté possible:

Pourquoi est-ce une erreur d'utiliser un ensemble de supports vides pour appeler un constructeur sans argument?

permet de faire ce code xxx

alors nous avons des résultats: xxx

pouvez-vous expliquer ce qui se passe dans le cas où 3 ?


4 commentaires

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.. ;)


6 Réponses :


12
votes

La troisième ligne est analysée comme déclarant une fonction qui ne prend aucun argument et renvoie un foo .


0 commentaires

8
votes

foo f3 (); déclare une fonction appelée f3 , avec un type de retour de foo .


1 commentaires

Ah, bien sûr! J'étais tellement concentré sur les constructeurs ...



2
votes

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.


0 commentaires

5
votes

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.

D'où la syntaxe FOO F3 (); déclare réellement une fonction qui ne prend aucun argument et retourne foo . Travaillez ceci en écrivant par écrit foo f3; , il appellera également le constructeur par défaut (s'il y en a un, bien sûr).


0 commentaires

4
votes
  • F1 invoque le constructeur de copie après un appel explicite, vous avez tort sur celui-ci
  • f2 est un appel de constructeur explicite // vous avez tort ici trop
  • f3 déclare une fonction
  • F4 est à nouveau le constructeur de copie, comme F1 // Vous êtes ici
  • F5 appelle le constructeur par défaut // Vous êtes à nouveau ici

2 commentaires

foo f6 = 5; serait par un appel de constructeur implicite? IIRC.


@Douglas: Oui, ce serait correct.



3
votes

Ce n'est pas ce que vous pensez que c'est: xxx

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 f3 qui ne prend aucun paramètre et renvoie un foo par valeur.

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 .


1 commentaires

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