2016-09-06 12 views
20

inicjowanie struct z wartościami domyślnymi jest trywialne:Brace (kruszywo) inicjalizacja dla kodowanym z wartościami domyślnymi

struct X { int a; int b = 2; }; 

i inicjowanie struct z inicjatora nawiasów jest trywialne też:

X x = {1, 3}; 

Zaskakująco kod init nie zostanie skompilowany, dopóki nie usunę domyślnej wartości. Więc jak mam zrobić init w takim przypadku? Chciałbym zachować X a POD bez corsa.

+4

Tylko dla FYI: z C++ 14, kod kompiluje. – Mine

+1

udokumentowane tutaj: http://en.cppreference.com/w/cpp/language/aggregate_initialization – Hayt

+2

'Definicja agregatów została zmieniona, aby jawnie wykluczyć jakąkolwiek klasę z inicjatorami członków; w związku z tym nie mogą korzystać z agregacyjnej inicjalizacji. C++ 14 rozluźnia to ograniczenie, umożliwiając tym samym agregacyjną inicjalizację. Jeśli wzmocniona lista init nie dostarcza wartości dla tego argumentu, inicjator członu zajmuje się nią, więc w zasadzie kod nie jest możliwy w C++ 11 bez C-tor. Tylko w C++ 14 –

Odpowiedz

18

Oto niektóre dokumenty istotne dla problemu:

http://en.cppreference.com/w/cpp/language/aggregate_initialization

W kod jest nieprawidłowy. W numerze jest ponownie ważny.

W C++ 11 dodanie domyślnej inicjalizacji uniemożliwia wzmocnienie init. W C++ 14 nie.

Sposobem na rozwiązanie problemu w C++ 11 byłoby napisanie konstruktora o wartości dla a i wartości b z wartością domyślną.

+0

Miałem jakieś dezinformacje w mojej oryginalnej odpowiedzi. Zmieniono go na właściwe rozwiązanie, ale pozostawiono oryginalną odpowiedź, ponieważ POD-ność wydawała się również istotna dla OP – Hayt

+0

Edytowałem ** oryginalne ** i ** edytowane ** części, scalając część, która była nadal ważna w oryginalna, gdy już była przygotowana część. Jeśli ktoś chce zobaczyć historię, może kliknąć link historii. Czy moje modyfikacje zachowały pierwotny zamiar? Jeśli nie, możesz cofnąć, ale zachęcam do zrzucenia wzoru edycji/oryginału. – Yakk

+0

Wiadomość jest wciąż taka sama. Pomyślałem, że to dobrze w tamtym czasie (kiedy wiadomość nie zawierała wzmianek i nie została zaakceptowana), aby wskazać OP, że moja początkowa odpowiedź nie była tą, której szukał. Teraz jest akceptowana + jedyna odpowiedź tutaj widzę, że tak jest lepiej. – Hayt

Powiązane problemy