C ++ 11: Corregir la inicialización de std :: array?

Si inicializo un std :: array de la siguiente manera, el comstackdor me da una advertencia acerca de los paréntesis faltantes

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

Esto soluciona el problema:

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

Este es el mensaje de advertencia:

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

¿Es esto solo un error en mi versión de gcc, o se hace intencionalmente? Si es así, ¿por qué?

Esta es la implementación std::array de std::array :

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

Es una estructura agregada cuyo único miembro de datos es una matriz tradicional, de modo que el {} interno se usa para inicializar la matriz interna.

La elisión de la abrazadera está permitida en ciertos casos con inicialización agregada (pero generalmente no se recomienda), por lo que solo se puede usar una abrazadera en este caso. Vea aquí: C ++ vector de matrices

De acuerdo con cppreference . Se requieren llaves dobles solo si = se omite.

 // 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"} }; 

Se requieren llaves dobles en C ++ 11, pero no desde 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 = 

std :: matriz de referencia