Usando std :: array con listas de inicialización

A menos que esté equivocado, debería ser posible crear una matriz std: de esta manera:

std::array strings = { "a", "b" }; std::array strings({ "a", "b" }); 

Y, sin embargo, usando GCC 4.6.1 no puedo hacer que ninguno de estos funcione. El comstackdor simplemente dice:

 expected primary-expression before ',' token 

y, sin embargo, las listas de inicialización funcionan bien con std :: vector. Entonces, ¿cuál es? ¿Me equivoco al pensar que std :: array debería aceptar listas de inicialización, o tiene el equipo GNU Standard C ++ Library equivocado?

std::array es divertido. Se define básicamente así:

 template struct std::array { T a[size]; }; 

Es una estructura que contiene una matriz. No tiene un constructor que tome una lista de inicializadores. Pero std::array es un agregado según las reglas de C ++ 11 y, por lo tanto, puede crearse mediante la inicialización agregada. Para agregar inicializar la matriz dentro de la estructura, necesita un segundo conjunto de llaves:

 std::array strings = {{ "a", "b" }}; 

Tenga en cuenta que la norma sugiere que las llaves adicionales se pueden elid en este caso. Entonces es probable que sea un error de GCC.

Para agregar a la respuesta aceptada:

 std::array a1{'a', 'b'}; std::array a2 = {'a', 'b'}; std::array a3{{'a', 'b'}}; std::array a4 = {{'a', 'b'}}; 

todo funciona en GCC 4.6.3 (Xubuntu 12.01). Sin embargo,

 void f(std::array a) { } //f({'a', 'b'}); //doesn't compile f({{'a', 'b'}}); 

lo anterior requiere llaves dobles para comstackr. La versión con llaves individuales produce el siguiente error:

 ../src/main.cc: In function 'int main(int, char**)': ../src/main.cc:23:17: error: could not convert '{'a', 'b'}' from '' to 'std::array' 

No estoy seguro de qué aspecto de la inferencia / conversión de tipo hace que las cosas funcionen de esta manera, o si esto es una peculiaridad de la implementación de GCC.