2015-03-27 23 views
9

I mają następujące wartości C++ 11 kod:C++ 11 Inicjowanie listy części dynamicznych (błąd lub nieporozumienie)?

int *ipa = new int[5]{1, 2, 3}; 

mi rozumieć, że elementy 3 i 4 miały mieć wartość 0 (w tym przypadku) zainicjowany. W Visual C++ 2013 tak się dzieje. W Mingw 4.8.1 nie jest; są domyślnie inicjowane (to znaczy niezainicjowane).

Moje pytanie brzmi, czy jest to znany błąd kompilatora (GCC lub MingW)? Przeszukałem wszystkie listy błędów (i Google) na próżno. Czy też w jakiś sposób źle zrozumiałem, co ma się wydarzyć?

+0

[Wygląda ten został ustalony dla serii 4.9 Release] (http://coliru.stacked-crooked.com/a/29db8ce2fee8ed7d). – Casey

+1

Dokładniej: [4.8.1 ma błąd] (http://melpon.org/wandbox/permlink/YaahoDQESVBxFfyp), [4.8.2 nie] (http://melpon.org/wandbox/permlink/0mw4m8fhvkRYqsK3) . Więc [to musi być jeden z tych błędów?] (Https://gc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&list_id=113864&resolution=FIXED&target_milestone=4.8.2). – Casey

+0

Casey - dziękuję. To była dokładnie ta informacja, której potrzebowałem. – user1663569

Odpowiedz

1

Po pierwsze, jeśli podejrzewasz, że jest błąd, nie ma nic złego w jego zgłaszaniu. Oto link do GCC bugzilla i ich bug reporting instructions. Przynajmniej musisz dostarczyć test case i system operacyjny oraz wersję twojego kompilatora. Nie ma sensu zgłaszanie go do SO, ponieważ można przeczytać all about initialization here.


właściwego zachowania jest to, że pozostałe elementy są inicjalizowane na 0. Cytowanie C++ 11 projekt normy:

§5.3.4/15a nowy ekspresja który tworzy obiekt typu T inicjuje tego obiektu w następujący sposób: [...]

  • w przeciwnym razie nowa-inicjator interpretuje się zgodnie z regułami inicjalizacji 8.5 dla bezpośredniego inicjowania.

§8.5.4/3 Wykaz inicjalizacja obiektu lub odniesienia typu T jest zdefiniowane następująco: [...]

  • przeciwnym razie, jeśli T jest kruszywo, kruszywo inicjalizacji jest wykonywany (8.5.1).

[...]

  • W przeciwnym razie, jeśli lista inicjator ma żadnych elementów, obiekt jest wartość zainicjowany.

§8.5.1/7 Jeżeli istnieją mniej initializer-klauzule na liście niż są członkowie łącznie, to każdy członek nie jawnie zainicjowany zostanie zainicjowana od pustej listy (inicjator 8.5.4).

§8.5/5 w zerowej inicjalizacji przedmiot lub odniesienia typu T oznacza

  • jeśli T jest typu skalarny (3,9), których celem jest ustawiana na wartość 0 (zero); , traktowane jako stałe wyrażenie stałe, przekształcone na T; [...]

§8.5/7 do wartości inicjalizacji obiekt typu T oznacza: [...]

  • jeśli T jest macierzowych, a każdy element jest inicjowany wartości ;

  • w przeciwnym razie obiekt jest inicjowany zerowo.

1 Zacząłem meta wątek o nazwie Do we need a canonical question about C++ initialization? do rozwiązania problemu braku uprzedniego badania w kwestii inicjowania.

0

Kompilator zainicjować element 3 i 4 0.

C++ 11 to wyrażenie jest obsługiwana.

tak, że można zainicjować tablicę (int lub char ...), takie jak: int a[10] = {0};