3 votes

doubles parenthèses autour de la liste des paramètres de la fonction

J'ai le code suivant, il se compile avec gcc 4.4 sans aucun avertissement, et renvoie 42.

template<typename T>
struct foo
{ };

template<typename T>
struct foo<void (T)>
{
  enum { value = 42 };
};

int main()
{
  return foo<void ((int))>::value;
}

Maintenant, je vois pourquoi cela devrait fonctionner quand le paramètre du modèle est void (int) mais c'est quoi le problème avec les doubles parenthèses ? Est-ce légal en C++ ? Est-ce la même chose que void (int) ?

Cheers

4voto

Ise Wisteria Points 5852

Dans ce cas, void ((int)) est identique à void (int) .
void ((int)) partie en foo<void ((int))> s'appelle type-id .
Selon le §8.1/1, type-id est composé de type-specifier-seq y abstract-declarator .
Sur void ((int)) , type-specifier-seq es void y abstract-declarator est ((int)) , et abstract-declarator peut être mis entre parenthèses de façon arbitraire.
Ceci est légal en C et C++.

3voto

Mark Ransom Points 132545

Les parenthèses intérieures sont utilisées pour modifier l'ordre d'évaluation de l'expression. L'ordre n'a pas d'importance lorsqu'il n'y a qu'une seule partie de l'expression, elles ne font donc rien.

1voto

jbp Points 381
  • Les modèles sont différents des macros.

  • Votre "void (T)" est identique à "void T" et "void ((int))" est identique à "void int" tout comme "void ((((int))))" est identique à "void int". L'expression entre parenthèses est évaluée comme @Mark l'a souligné.

0voto

Jerry Coffin Points 237758

Dans ce cas, c'est no nécessaire à cette fin, mais la principale raison de l'utilisation de doubles parenthèses comme celle-ci, est d'éviter l'analyse la plus contrariante.

Les doubles parenthèses ne sont pas autorisées dans une déclaration de fonction, mais le sont dans un appel de fonction, de sorte que le code qui produirait autrement l'analyse la plus vexante peut être forcé à être un appel de fonction en enfermant au moins un argument entre doubles parenthèses.

Une partie du code que j'ai inclus dans un réponse précédente a démontré ceci.

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