Dans le code suivant: dans la ligne p> J'ai remarqué que le unaire et Le code> (adresse de) opérateur est facultatif et le programme compile et exécute de la même manière avec ou sans elle (sous Linux avec GCC 4.2.4). Pourquoi? Est-ce une question spécifique au compilateur, ou peut-être deux normes de langue différentes étant acceptées par le compilateur? Merci. P> p>
4 Réponses :
Vous êtes correct que le a la fonction de fonction em> est une expression qui a un type de fonction. Sauf lorsqu'il s'agit de l'opérande de & code> est facultatif. Les fonctions, comme des tableaux, peuvent être automatiquement converties en pointeurs. Ce n'est ni spécifique au compilateur ni le résultat de normes de langue différentes. Du niveau standard, Section 6.3.2.1 Strong>, paragraphe 4: p>
Tailleof CODE> STRY> OPLUT OU LA UNIERNE
CODE> STRON> Opérateur, un concepteur de fonction avec type " Fonction renversement type em> "est converti en une expression de type" pointeur pour fonctionner de retourner type em> ". P>".
blockQuote>
J'ai également été évanouis, j'ai une forte soupçon c'était des bowvotes rivaux ... voici une indemnité de moi
@Armen Tsirunyan: les statistiques "de la rivalité" ne montrent pas assez de bowvotes pour lui faire le coupable. Ce qui me met apparemment sous la suspicion :) Mais je ne l'ai pas fait! Doit être des bowvotes de troll.
@Andreyt: Je suis désolé d'assumer à la hâte un bowvote rival. J'étais évidemment tort. Ce doit être la frustration qui parle :)
@Andreyt, @armen: Je n'ai pas été évité, mais comme vous l'avez remarqué, j'ai trop peu de bowvotes pour être coupable. C'est une mise en place! Je peux prouver mon innocence!
répondant à C ++. Pour C, les mêmes conservent em> strong> p>
Devis de la norme C ++ (4.3.1): P>
Un lvalue de type de fonction T peut être
converti en une rvalue de type
"Pointeur à T." Le résultat est un
pointeur sur la fonction.50) p>
blockQuote>
la même chose pour les tableaux. (4.2.1) P>
Un lvalue ou rvalue de type "Array ofn
T "ou" gamme de liaison inconnue de T "
peut être converti en une rvalue de type
"Pointeur à T." Le résultat est un
pointeur sur le premier élément de la
Array. P>
blockQuote>
Mais veuillez noter que ce sont des conversions et en aucun moyen est une fonction un pointeur de fonction ou un tableau un pointeur. Htth p>
de la norme (6.3.2.1/4): p>
a la fonction de fonction em> est une expression qui a type de fonction. Sauf quand il est l'opérande de la taille de opérateur ou l'opérateur unaire et l'opérateur, un Concepteur de fonction avec type '' Fonction de retour de retour '' est converti en une expression qui a Tapez '' pointeur pour fonctionner Tapez '' strong>. p> blockQuote>
Alors oui, omettez le
& code> donne un pointeur pour fonctionner quand même. p>
opérateur symétriquement, opérateur & code> est en effet facultatif lors de la prise de l'adresse d'une fonction dans votre contexte (attribuant quelque chose à quelque chose). Ce n'est pas spécifique au compilateur, il résulte de la définition formelle de la langue. P>
* code> est facultatif lors de l'appel de la fonction via un pointeur. Dans votre exemple, vous pouvez appeler la fonction comme
(* logfunc) (n) code> ou
logfunc (n) code>. Vous avez utilisé ce dernier, mais le premier fonctionnerait aussi. P>
BTW- Est-ce que tout cela signifie qu'un pointeur de fonction "se comporte de la même manière" qu'une référence à la fonction se comporterait?
@Kos: Il peut sembler de se comporter de la même manière au niveau du code source, bien que la similitude soit purement superficielle: la mécanique de la langue abstraite sous-jacente est plutôt différente. Pourtant, si vous creusez même plus profondément et regardez la mécanique de la machine, vous verrez qu'ils semblent être la même.