Inicialização de membros na classe com uma lista de inicializadores usando sintaxe de inicialização uniforme?[duplicado]

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

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top