C ++ 11: Corrigir a boot do std :: array?

Se eu inicializar um std :: array da seguinte maneira, o compilador me avisa sobre falta de chaves

std::array a = {1, 2, 3, 4}; 

Isso corrige o problema:

 std::array a = {{1, 2, 3, 4}}; 

Esta é a mensagem de aviso:

 missing braces around initializer for 'std::array::value_type [4] {aka int [4]}' [-Wmissing-braces] 

Isso é apenas um bug na minha versão do gcc, ou é feito intencionalmente? Se sim, porque?

Esta é a implementação nua do std::array :

 template struct array { T __array_impl[N]; }; 

É uma estrutura agregada cujo único membro de dados é uma matriz tradicional, de forma que o {} interno seja usado para inicializar a matriz interna.

A elisão de órtese é permitida em certos casos com boot agregada (mas geralmente não é recomendada) e, portanto, apenas uma chave pode ser usada neste caso. Veja aqui: vetor de matrizes C ++

Segundo a cppreferência . Chaves duplas são necessárias somente se = for omitido.

 // construction uses aggregate initialization std::array a1{ {1,2,3} }; // double-braces required std::array a2 = {1, 2, 3}; // except after = std::array a3 = { {std::string("a"), "b"} }; 

Chaves duplas requeridas no C ++ 11, mas não desde o C ++ 14:

 // construction uses aggregate initialization std::array a1{ {1, 2, 3} }; // double-braces required in C++11 (not in C++14) std::array a2 = {1, 2, 3}; // never required after = 

Referência std :: array