web-dev-qa-db-fra.com

L'initialisation scalaire à double entretoise est-elle autorisée par la norme C ++?

J'ai le code suivant:

int x = {{}};

Cette syntaxe est-elle valide selon la norme C++? (Je suis intéressé par C++ 11 et versions ultérieures.)

Lors de l'utilisation des derniers compilateurs, il n'y a pas de problème, cependant dans certains anciens (par exemple GCC 4.8.5), il donne l'erreur suivante:

erreur: accolades autour de l'initialiseur scalaire pour le type 'int'

34
Igor

C'est mal formé. gcc a tort de l'accepter et clang semble l'autoriser comme extension, comme il le prévient .

Je vais citer le dernier projet, mais cela ne fait aucune différence. L'initialisation de liste fonctionne comme suit [dcl.init.list] , où T est int dans ce cas:

  • Si la liste d'initialisation est une liste d'initialisation désignée , [...] => ce n'est pas
  • Si T est une classe agrégée [...] => ce n'est pas
  • Si T est un tableau de caractères [...] => ce n'est pas le cas.
  • Si T est un agrégat [...] => ce n'est pas le cas (seuls les tableaux et les classes peuvent être des agrégats)
  • Si la liste d'initialisation ne contient aucun élément [...] => elle n'en a pas
  • Si T est une spécialisation de std :: initializer_list [...] => ce n'est pas
  • Si T est un type de classe [...] => ce n'est pas
  • Si T est une énumération de type sous-jacent fixe [...] => ce n'est pas
  • Si la liste d'initialisation a un seul élément de type E [...] => une liste d'initialisation contreventée n'a pas de type, donc pas
  • Si T est un type de référence [...] => ce n'est pas
  • Si la liste d'initialisation ne contient aucun élément [...] => elle n'en a pas
  • Sinon, le programme est mal formé
35
Rakete1111