Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't simple initialize (with braces) 2D std::array? [duplicate]

Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are different

I defined simple 2D array (3X2):

  std::array<std::array<int,3>,2> a {     {1,2,3},     {4,5,6}   }; 

I was surprised this initialization does not work, with gcc4.5 error: too many initializers for 'std::array<std::array<int, 3u>, 2u>'

Why can't I use this syntax?

I found workarounds, one very funny with extra braces, but just wonder why the first, easiest approach is not valid?

Workarounds:

  // EXTRA BRACES   std::array<std::array<int,3>,2> a {{     {1,2,3},     {4,5,6}   }};    // EXPLICIT CASTING   std::array<std::array<int,3>,2> a {     std::array<int,3>{1,2,3},     std::array<int,3>{4,5,6}   }; 

[UPDATE]

Ok, thanks to KerrekSB and comments I get the difference. So it seems that there is too little braces in my example, like in this C example:

struct B {   int array[3]; }; struct A {   B array[2]; };  B b = {{1,2,3}}; A a = {{      {{1,2,3}},      {{4,5,6}} }}; 
like image 640
PiotrNycz Avatar asked Oct 11 '12 16:10

PiotrNycz


1 Answers

std::array<T, N> is an aggregate that contains a C array. To initialize it, you need outer braces for the class itself and inner braces for the C array:

std::array<int, 3> a1 = { { 1, 2, 3 } }; 

Applying this logic to a 2D array gives this:

std::array<std::array<int, 3>, 2> a2 { { { {1, 2, 3} }, { { 4, 5, 6} } } }; //                                   ^ ^ ^ ^            ^ ^ //                                   | | | |            | | //                                   | +-|-+------------|-+ //                                   +-|-+-|------------+---- C++ class braces //                                     |   | //                                     +---+--- member C array braces 
like image 178
Kerrek SB Avatar answered Sep 25 '22 13:09

Kerrek SB