2015-03-27 21 views
9

Ho il seguente codice C++ 11:Inizializzazione dell'elenco parziale dell'array dinamico C++ 11 (errore o incomprensione)?

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

ho pensato che capito che gli elementi 3 e 4 dovevano essere valore (0 in questo caso) inizializzato. In Visual C++ 2013, ciò sta accadendo. In Mingw 4.8.1 non lo è; vengono inizializzati di default (cioè non inizializzati).

La mia domanda è, questo è un bug noto del compilatore (GCC o MingW)? Ho cercato in tutti gli elenchi di bug (e su Google) invano. Oppure, ho in qualche modo frainteso ciò che dovrebbe accadere?

+0

[Sembra che questo è stato fissato per la serie 4.9 di rilascio] (http://coliru.stacked-crooked.com/a/29db8ce2fee8ed7d). – Casey

+1

In particolare: [4.8.1 ha il bug] (http://melpon.org/wandbox/permlink/YaahoDQESVBxFfyp), [4.8.2 no] (http://melpon.org/wandbox/permlink/0mw4m8fhvkRYqsK3) . Quindi [deve essere uno di questi bug?] (Https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&list_id=113864&resolution=FIXED&target_milestone=4.8.2). – Casey

+0

Casey - grazie. Questa era esattamente l'informazione di cui avevo bisogno. – user1663569

risposta

1

Prima di tutto, se si sospetta che ci sia un bug, non c'è nulla di male nel riferirlo. Ecco un collegamento allo GCC bugzilla e al loro bug reporting instructions. Per lo meno, è necessario fornire un caso di test, il sistema operativo e la versione del compilatore. Non c'è molto poco da riferire a SO in primo luogo, dal momento che è possibile leggere all about initialization here.


Il comportamento corretto è che gli elementi rimanenti vengono inizializzati a 0. Citando C++ 11 progetto di norma:

§5.3.4/15 A nuova espressione che crea un oggetto di tipo T inizializza l'oggetto come segue: [...]

  • in caso contrario, il nuova initializer viene interpretato in base alle regole di inizializzazione di 8.5 per l'inizializzazione diretta.

§8.5.4/3 Elenco-inizializzazione di un oggetto o di riferimento di tipo T è definito come segue: [...]

  • Altrimenti, se T è un aggregato, aggregato inizializzazione viene eseguito (8.5.1).

[...]

  • In caso contrario, se la lista di inizializzazione non ha elementi, l'oggetto è il valore-inizializzato.

§8.5.1/7 Se ci sono meno inizializzazione-clausole nell'elenco di ci sono membri, complessivamente, allora ogni membro non esplicitamente inizializzato va inizializzato da una lista di inizializzazione vuota (8.5.4).

§8.5/5 Per zero inizializzare un oggetto o di riferimento di tipo T significa:

  • se T è un tipo scalare (3.9), l'oggetto viene impostato al valore 0 (zero) , preso come espressione costante integrata, convertito in T; [...]

§8.5/7 Per valore-inizializzare un oggetto di tipo T significa: [...]

  • se T è un tipo di matrice, quindi ogni elemento viene valore inizializzato ;

  • in caso contrario, l'oggetto è inizializzato a zero.

1 ho iniziato un filo meta chiamato Do we need a canonical question about C++ initialization? per ovviare alla mancanza di ricerche prima in questioni di inizializzazione.

0

Il compilatore inizializza l'elemento 3 e 4 essere 0.

in C++ 11 questa espressione viene supportato.

Così che, è possibile inizializzare l'array (int o char ...) come: int a[10] = {0};