Le code suivant se compile avec succès avec g++ 4.8.1 :
int main()
{
int(*)();
}
Cela ressemble à une simple déclaration d'un pointeur vers une fonction :
int(*f)();
Il ne compile pas avec clang 3.4 et vc++ 2013.
S'agit-il d'un bug du compilateur ou d'une des zones d'ombre de la norme ?
Liste de morceaux de code étranges similaires qui compilent bien avec g++ 4.8.1 (mis à jour) :
-
int(*)();
-
int(*);
-
int(*){};
-
int(*());
Exemple concret avec ces étranges morceaux de code .
Mise à jour 1 : @Ali a ajouté quelques informations intéressantes dans les commentaires :
Les 4 cas donnent une erreur de compilation avec clang 3.5 trunk (202594) et compilent bien avec gcc 4.9 trunk (20140302). Le comportement est le même avec
-std=c++98 -pedantic
sauf pourint(*){};
ce qui est compréhensible ; les listes d'initialisation étendues ne sont disponibles qu'avec l'option-std=c++11
.
Mise à jour 2 : Comme @CantChooseUsernames noté dans sa réponse ils compilent toujours bien même avec l'initialisation et aucun assemblage n'est généré pour eux par g++ (ni avec ni sans initialisation) même sans aucune optimisation activée :
-
int(*)() = 0;
-
int(*) = 0;
-
int(*){} = 0;
-
int(*()) = 0;
Exemple concret avec initialisations .
Mise à jour 3 : J'ai été vraiment surpris de constater que int(*)() = "Hello, world!";
compile bien, aussi (alors que int(*p)() = "Hello, world!";
ne compile pas, bien sûr).
Mise à jour 4 : C'est fantastique mais int(*){} = Hello, world!;
compile bien. Et le morceau de code suivant, extrêmement étrange, aussi : int(*){}() = -+*/%&|^~.,:!?$()[]{};
( exemple concret ).