class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Uważam, że powodem jest to, że tablice można zainicjować tylko za pomocą =
składni, czyli:
int arr[3] = {1,3,4};
pytania
- Jak mogę zrobić to, co chcę zrobić (to znaczy zainicjować tablicę w konstruktorze (bez przypisywania elementów w treści)). Czy to w ogóle możliwe?
- Czy standard C ++ 03 mówi coś specjalnego na temat inicjowania agregatów (w tym tablic) w inicjalizatorach ctor? Czy nieważność powyższego kodu jest następstwem innych reguł?
- Czy listy inicjalizujące C ++ 0x rozwiązują problem?
PS Proszę nie wspominać o wektorach, boost :: tablice i ich wyższości nad tablicami, o czym dobrze wiem.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
źródło
źródło
Odpowiedzi:
Tak. Używa struktury, która zawiera tablicę. Mówisz, że już o tym wiesz, ale wtedy nie rozumiem pytania. W ten sposób możesz zrobić zainicjować tablicy w konstruktorze, bez zadań w organizmie. To właśnie
boost::array
robi.Mem-initializer używa bezpośredniej inicjalizacji. A zasady klauzuli 8 zabraniają takich rzeczy. Nie jestem pewien co do następującego przypadku, ale niektóre kompilatory na to pozwalają.
Więcej informacji można znaleźć w dokumencie GCC PR .
Tak, robią. Myślę jednak, że twoja składnia jest nieprawidłowa. Musisz użyć bezpośrednio nawiasów klamrowych, aby uruchomić inicjalizację listy
źródło
char * const foo[6];
członek klasy. To wymaga inicjatora do kompilacji w C ++ 11.C ++ 98 nie dostarcza bezpośredniej składni dla niczego poza zerowaniem (lub dla elementów innych niż POD, inicjalizacją wartości) tablicy. Po prostu piszesz
C(): arr() {}
.Wydaje mi się, że Roger Pate myli się co do rzekomych ograniczeń inicjalizacji agregacji C ++ 0x, ale jestem zbyt leniwy, żeby to sprawdzić lub sprawdzić, i to nie ma znaczenia, prawda? EDYCJA : Roger mówił o „C ++ 03”, źle go odczytałem jako „C ++ 0x”. Przepraszam, Roger. ☺
Obejściem C ++ 98 dla bieżącego kodu jest zawinięcie tablicy w a
struct
i zainicjowanie jej ze stałej statycznej tego typu. Dane i tak muszą gdzieś znajdować się. Bez mankietu może to wyglądać tak:źródło
Obejście:
źródło
W C ++ 03 inicjalizacja agregacji ma zastosowanie tylko ze składnią podobną do poniższej, która musi być oddzielną instrukcją i nie pasuje do inicjatora ctor.
źródło
Co powiesz na
?
Kompiluje się dobrze na g ++ 4.8
źródło
Chcesz zainicjować tablicę int w swoim konstruktorze? Skieruj go na tablicę statyczną.
źródło