Initialisation des membres en classe avec une liste d'initialisation utilisant une syntaxe d'initialisation uniforme ?[dupliquer]

StackOverflow https://stackoverflow.com//questions/24035388

Question

J'essaie de compiler ce qui suit avec MSVC2013 :

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

Le compilateur me donne l'erreur suivante : SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

Si je change le code comme suit :

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

le programme se compile et fonctionne correctement.Est-ce un problème avec le compilateur ou est-ce que je ne comprends pas la syntaxe ?D'après ce que j'ai lu, la première version devrait être compilée.

Était-ce utile?

La solution

Voici la grammaire responsable de N3797 :

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

Je dirais donc que la première déclaration est correcte et elle est en effet acceptée par un récent gcc et clang.

Autres conseils

Si placer des points-virgules comme il est nécessaire

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

alors il semble que ce soit un bug du compilateur MS VC++ 2013.Au moins, le code est compilé avec succès sur www.ideone.com.

Structire SomeStruct est un agrégat et doit être initialisé à l'aide d'une liste d'initialisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top