Ci sono due problemi uno che è una questione di stile e l'avviso.
Sebbene possa non essere ovvio, l'inizializzazione di aggregazione avviene su un temporaneo che viene quindi utilizzato come argomento per il costruttore di copie. Il più idiomatico per fare questa inizializzazione sarebbe il seguente:
std::array<int, 10> arr = {};
Anche se questo lascia ancora l'avviso.
L'avvertimento è coperto da gcc bug report: - -Wmissing-field-initializers relaxation request e uno dei commenti dice:
[...] Sicuramente, la sintassi C++ di dire MyType x = {}; dovrebbe essere sostenuta, come si vede qui:
http://en.cppreference.com/w/cpp/language/aggregate_initialization
dove per esempio:
struct S {
int a;
float b;
std::string str;
};
S s = {}; // identical to S s = {0, 0.0, std::string};
che non dovrebbe mettere in guardia per i motivi indicati nei commenti precedenti.
e un commento di follow-up dice:
La mia dichiarazione circa zero-inizializzazione è stato impreciso (grazie), ma il punto generale si trova ancora: in C devi scrivere '= {0 } 'dal momento che inizializzatore di parentesi vuote non è supportato dalla lingua (si ottiene un avviso con -pedantic); in C++, puoi scrivere '= {}' o 'T foo = T();', ma non è necessario scrivere '= {0}' in modo specifico.
Le ultime versioni di gcc non producono questo avviso per questo caso, see it live working with gcc 5.1.
Possiamo vedere questo argomento anche nelle liste degli sviluppatori Clang nel numero: -Wmissing-field-initializers.
Per riferimento il progetto standard C++ 11 sezione 8.5.1
[dcl.init.aggr] dice:
Se ci sono meno di inizializzazione-clausole della lista che ci sono membri nel complesso, quindi ogni membro non esplicitamente inizializzato va inizializzato da una lista vuota di inizializzazione (8.5.4) . [ Esempio:
struct S { int a; const char* b; int c; };
S ss = { 1, "asdf" };
inizializza ss.a con 1, ss.b con "asdf", e ss.c con il valore di un'espressione della forma int(), cioè, 0. - fine esempio]
Così come questo è C++ valido, anche se come indicato utilizzando {}
non è valido C99. Si potrebbe obiettare che si tratta solo di un avvertimento, ma questo sembra C++ idiomatico usando {}
per l'inizializzazione degli aggregati ed è problematico se si utilizza -Werror
per trasformare gli avvisi in errori.
_ "questo non funziona ... ricevo il seguente avviso" _ Quindi ha funzionato allora. Se non funzionasse, non sarebbe stato compilato! –
@JonathanWakely Credo che l'OP cercasse di esprimere sorpresa con l'avvertimento e l'ho trovato sorprendente. Questo è davvero problematico se stai usando '-Werror', che faccio io.È bello vedere che l'avvertenza è stata rimossa dalle versioni recenti ma che non aiuta chi non può effettuare l'aggiornamento :-( –
@ShafikYaghmour, ma l'OP non stava usando -Werror (o non direbbe "avviso") e l'uso indiscriminato di -Werror senza un uso giudizioso di -Wno-xxxx non è necessariamente una buona idea.Vedo che l'avviso è sorprendente, ** ma funziona **, tutti gli elementi sono inizializzati a zero come previsto. come sottolinea AnT, usare '({})' è strano e dovrebbe essere scoraggiato, i bambini punteranno e ridono di te per strada se lo fai. –