33 votes

L'analyse la plus frustrante de C ++ à nouveau

Tiré directement de http://herbsutter.com/2013/05/09/gotw-1-solution/

Bien que widget w(); soit clair pour moi, je ne sais pas comment le code ci-dessous peut être une déclaration de fonction.

 // same problem (gadget and doodad are types)
//
widget w( gadget(), doodad() );  // pitfall: not a variable declaration
 

Comment est-ce possible?

39voto

Dans une déclaration de fonction, les arguments de type tableau de désintégration dans des pointeurs vers le premier élément, les arguments de la fonction du type de désintégration dans un pointeur de fonction, de sorte que la signature serait:

widget w( gadget(*)(), doodad(*)() );

C'est une fonction qui prend comme premier argument un pointeur vers une fonction prenant aucun argument et retournant gadget, qui prend comme deuxième argument un pointeur vers une fonction prenant aucun argument et retournant un doodad et que la fonction elle-même renvoie à un widget

Il y a encore plus intéressant ou de confusion cas, comme:

// assume 'x' is a variable defined somewhere:
widget w(gadget(x));

Comment pouvait qu' être interprété comme une déclaration de fonction? Je veux dire, x est une variable, non? Ainsi, lorsque l'on déclare une variable, vous pouvez ajouter de la parenthèse, donc, gadget x; et gadget (x); déclarer la même variable x. Le même s'applique à des arguments de la fonction, donc le code ci-dessus ressemble à une déclaration d'une fonction qui prend un premier argument nommé x de type gadget et renvoie un widget...

1voto

RiaD Points 15744

C'est une fonction qui obtient deux fonctions, qui renvoie gadget et doodad et aucun des deux n'obtient aucun argument.

Exemple qui compile bien.

 #include <iostream>
class widget{};
class gadget{};
class doodad{};
gadget a(){}
doodad b() {};
widget w( gadget(), doodad() ){
}
int main() {
    w(a,b);
    return 0;
}
 

http://ideone.com/YjZK9Y

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X