2009-06-21 8 views
4

Je lisais la question de litb sur SFINAE here et je me demandais exactement ce que son code déclarait. Un simple (sans modèles) est par exemple ci-dessous:Est-ce que cette ligne déclare une fonction? C++

int (&a())[2]; 

Qu'est-ce exactement que la déclaration? Quel est le rôle du &? Pour ajouter à ma confusion, si je déclare ce qui suit à la place

int b()[2]; 

Je reçois une erreur sur la déclaration d'une fonction qui retourne un tableau, alors que la première ligne n'a pas une telle erreur (donc, on pense que la première déclaration est pas une fonction). Cependant, si je tente d'attribuer un

a = a; 

Je reçois une erreur disant que je tente d'assigner la fonction d'un ... maintenant il est une fonction. Quelle est exactement cette chose?

+0

J'ai utilisé cette construction plutôt étrange pour voir quelle fonction était appelée. sizeof (a()) vous donnera sizeof (int [2]).L'autre fonction serait déclarée int (& a()) [1]; et si celui-là était appelé, cela donnerait sizeof (int [1]). Il utilise le fait que pour tout T, sizeof (T &) == sizeof (T) –

Répondre

17

Il existe ces programmes géniaux appelés cdecl et C++ decl. Ils sont très utiles pour trouver des déclarations compliquées, en particulier pour les formes byzantines que C et C++ utilisent pour les pointeurs de fonction.

[email protected] ~ $ c++decl 
Type `help' or `?' for help 
c++decl> explain int (&a())[2] 
declare a as function returning reference to array 2 of int 
c++decl> explain int b()[2] 
declare b as function returning array 2 of int 

a renvoie une référence, b ne le fait pas.

+0

wow, ces programmes sont utiles. Je ne suppose pas qu'un port Windows existe? – jalf

+0

Je ne connais pas de version canonique de cdecl pour Windows (bien que vous puissiez toujours utiliser la version Linux via Cygwin), mais si vous google pour "cdecl.zip", il semble y avoir quelques ports windows qui sont différents les gens ont fait. –

+2

C'est en fait très utile. –

2
int (&a())[2]; 

Il déclare un symbole a qui est une fonction qui ne prend aucun argument et renvoie une référence à un tableau à deux éléments d'entiers.

int b()[2]; 

Ce symbole déclare b qui est une fonction qui ne prend aucun argument et renvoie un tableau à deux éléments d'entiers ... cela est impossible par la conception de la langue.

C'est relativement simple: obtenez un diagramme de priorité d'opérateur, commencez par le nom de symbole (a) et commencez à appliquer les opérateurs comme vous le voyez par leur précédence. Notez après chaque opération appliquée.

8

Pour référence ultérieure, vous pouvez trouver ce lien utile lorsque vous avez un C/déclaration C de particulièrement difficile à déchiffrer:

How To Read C Declarations

Pour être complet, je vais répéter ce que les autres ont dit répondre directement à votre question.

int (&a())[2]; 

... déclare un être une fonction sans argument qui renvoie une référence à un tableau d'entiers de taille 2. (Lisez les règles de base sur le lien ci-dessus pour avoir une compréhension claire de la façon dont je est venu avec cela.)

int b()[2]; 

... déclare b être une fonction sans argument qui renvoie un tableau d'entiers de taille deux.

Espérons que cela aide.

+1

Ce site Web est très pratique, merci pour cela – GRB

+0

C++ ne permet pas de retourner des tableaux, cependant. – fredoverflow

Questions connexes