initialize enclosed brace c++ constructor c++11 initializer-list

c++ - enclosed - ¿Es posible pasar datos como initializer_list a std:: array of structures?



c++ initializer list (1)

std::array es un agregado que contiene una matriz, por lo que necesita un par adicional de llaves para inicializarlo a partir de una matriz regular:

{1,2} // TheClass {{1,2},{2,3}} // TheClass[2] {{{1,2},{2,3}}} // std::array<TheClass,2> {{{{1,2},{2,3}}}} // OtherClass<2>

Sin embargo, parece que las versiones anteriores de GCC todavía se esfuerzan por esto: 4.5.1 lo rechaza , mientras que 4.6.1 lo acepta.

tengo el siguiente código. Básicamente, quiero inicializar una std :: array de estructuras que no sean POD utilizando la sintaxis de inicialización agregada. Tanto g ++ 4.6 como 4.7 (última instantánea semanal) no compilan el código.

#include <array> struct TheClass { int a1, a2; TheClass(int b1, int b2) : a1{b1}, a2{b2} {}; }; template<unsigned D> struct OtherClass { std::array<TheClass, D> a; OtherClass(std::array<TheClass, 2> b) : a{b} {}; }; int main() { OtherClass<2>{{ {1, 2}, {2, 3} }}; //tried a lot of options here }

Errores de GCC:

v.cpp: In function ‘int main()’: v.cpp:20:37: error: no matching function for call to ‘OtherClass<2u>::OtherClass(<brace-enclosed initializer list>)’ v.cpp:20:37: note: candidates are: v.cpp:15:5: note: OtherClass<D>::OtherClass(std::array<TheClass, 2ul>) [with unsigned int D = 2u] v.cpp:15:5: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::array<TheClass, 2ul>’ v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(const OtherClass<2u>&) v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const OtherClass<2u>&’ v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(OtherClass<2u>&&) v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘OtherClass<2u>&&’

Mis preguntas: ¿el código anterior es correcto? Parece que como std :: array es un agregado, no debería haber problemas para construir sus miembros de datos. Tal vez es un error en GCC?

EDITAR :

OtherClass<2>{{ TheClass{1, 2}, TheClass{2, 3} }}; funciona, por supuesto, pero no quiero usar eso ya que tengo que construir la clase en muchos lugares. C ++ 11 debe apoyar la omisión de TheClass . También vea esta pregunta .