Inicialização de membros na classe com uma lista de inicializadores usando sintaxe de inicialização uniforme?[duplicado]
Pergunta
Estou tentando compilar o seguinte com MSVC2013:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
}
O compilador me dá o seguinte erro: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
Se eu mudar o código para isso:
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{{false, false, false}};
}
o programa compila e funciona bem.Isso é um problema com o compilador ou não entendo a sintaxe?Pelo que tenho lido, a primeira versão deve ser compilada.
Solução
Aqui está a gramática responsável do 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
Então eu diria que a primeira declaração está correta e é realmente aceita por um recente gcc
e clang
.
Outras dicas
Se colocar ponto e vírgula conforme necessário
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
};
então parece que é um bug do compilador MS VC++ 2013.Pelo menos o código foi compilado com sucesso em www.ideone.com.
Structire SomeStruct é um agregado e deve ser inicializado usando uma lista de inicializadores.