Possible Duplicate:
c++ why initializer_list behavior for std::vector and std::array are differentDlaczego nie można łatwo zainicjować (z nawiasami klamrowymi) 2D std :: array?
zdefiniowałem prostą tablicę 2D (3x2):
std::array<std::array<int,3>,2> a {
{1,2,3},
{4,5,6}
};
Byłem zaskoczony tym inicjalizacji nie działa, z błędem gcc4.5: too many initializers for 'std::array<std::array<int, 3u>, 2u>'
Dlaczego nie mogę korzystać z tego składnia?
Znalazłem obejścia, jeden bardzo zabawny z dodatkowymi nawiasami klamrowymi, ale tylko zastanawiam się, dlaczego pierwsze, najłatwiejsze podejście nie jest ważne?
Obejścia:
// 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, dzięki KerrekSB i komentarze uzyskać różnicę. Tak więc wydaje się, że jest tam zbyt mało szelki w moim przykładzie, jak w tym przykładzie C:
struct B {
int array[3];
};
struct A {
B array[2];
};
B b = {{1,2,3}};
A a = {{
{{1,2,3}},
{{4,5,6}}
}};
'std :: array' jest agregat. – chris
Spodziewam się, że to zadziała. BTW innym obejściem jest pominięcie wewnętrznych nawiasów klamrowych, chociaż generuje ostrzeżenia na gcc 4.8. – juanchopanza
Wielowymiarowy przypadek nie różni się od przypadku jednowymiarowego, chociaż obsługa kompilatora może być różna. 'std :: array a {1,2};' też jest źle sformułowane (gcc 4.7.2 błędnie zaakceptuje taki kod, clang 3.1 nie będzie). Zobacz duplikat, do którego dołączyłem powyżej. Krótka odpowiedź brzmi: jest to znana wada w standardzie języka C++ 11. –