Je ne peux pas comprendre ceci:
int main() {
int (*) (int *) = 5;
return 0;
}
L'affectation ci-dessus se compile avec g ++ c ++ 11. Je sais que int (*) (int *)
c'est un pointeur vers une fonction qui accepte un (int *)
comme argument et renvoie un int, mais je ne comprends pas comment vous pourriez l'assimiler à 5. Au début, je pensais que c'était une fonction qui renvoie constamment 5 (d'après mon récent apprentissage en F #, probablement, haha), alors j'ai pensé, brièvement, que le pointeur de fonction pointe vers l'emplacement mémoire 5, mais cela ne fonctionne pas, clairement, et les valeurs hexadécimales non plus.
Pensant que cela pourrait être dû au fait que la fonction renvoie un int, et que l'attribution d'un int est ok (en quelque sorte), j'ai également essayé ceci:
int * (*) (int *) = my_ptr
où my_ptr
est de type int *
, du même type que ce deuxième pointeur de fonction, comme dans le premier cas avec le type int. Cela ne compile pas. L'affectation de 5, ou de toute valeur int, au lieu de my_ptr
, ne compile pas non plus pour ce pointeur de fonction.
Alors, que signifie la mission?
Mise à jour 1
Nous avons la confirmation qu'il s'agit d'un bug, comme indiqué dans la meilleure réponse. Cependant, on ne sait toujours pas ce qui arrive réellement à la valeur que vous affectez au pointeur de fonction, ou ce qui se passe avec l'affectation. Toute (bonne) explication à ce sujet serait très appréciée! Veuillez vous référer aux modifications ci-dessous pour plus de clarté sur le problème.
Modifier 1
J'utilise la version 4.8.2 de gcc (dans Ubuntu 4.8.2)
Modifier 2
En fait, l'assimiler à n'importe quoi fonctionne sur mon compilateur. Même l'assimiler à une variable std :: string, ou à un nom de fonction qui renvoie un double, fonctionne.
Modifier 2.1
Fait intéressant, en faire un pointeur de fonction vers n'importe quelle fonction qui renvoie un type de données qui n'est pas un pointeur, le laissera compiler, tel que
std::string (*) () = 5.6;
Mais dès que le pointeur de fonction est sur une fonction qui renvoie un pointeur, il ne se compile pas, comme avec
some_data_type ** (*) () = any_value;