Initialisation des membres en classe avec une liste d'initialisation utilisant une syntaxe d'initialisation uniforme ?[dupliquer]
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.
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.