2012-01-14 4 views
12

A std::array<T> è essenzialmente un array in stile C avvolto in un struct. L'inizializzazione di struct s richiede le parentesi e l'inizializzazione degli array richiede anche parentesi. Quindi ho bisogno di due coppie di parentesi graffe:std :: array <T> inizializzazione

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

Ma la maggior parte del codice di esempio che ho visto usa solo un paio di parentesi graffe:

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

Come mai questo è consentito, e ce l'ha tutti i benefici o svantaggi rispetto al primo approccio?

+0

io non sono sicuro che _is_ consentito dalla norma - possibilmente i compilatori che accettano che il codice si basano su un precedente C++ 11 draft, o semplicemente dare un avvertimento dato che è un'estensione che consente un codice mal formato. – ildjarn

+0

@ildjarn Secondo Johannes, è permesso. – fredoverflow

risposta

14

Il vantaggio è che si ha ... meno da digitare. Ma lo svantaggio è che ti è permesso di lasciare le parentesi solo quando la dichiarazione ha quel modulo. Se si lascia fuori = o se l'array è membro e lo si inizializza con member{{1, 2, 3, 4, 5}}, non si può passare solo un paio di parentesi.

Questo perché ci sono preoccupazioni di possibili ambiguità di sovraccarico quando le parentesi vengono passate alle funzioni, come in f({{1, 2, 3, 4, 5}}). Ma ha causato alcune discussioni e un rapporto sui problemi è stato generato.

Essenzialmente, l'inizializzazione = { ... } sempre ha potuto omettere parentesi, come in

int a[][2] = { 1, 2, 3, 4 }; 

Questo non è nuovo. Ciò che è nuovo è che si può omettere il =, ma poi è necessario specificare tutte le bretelle

int a[][2]{ {1, 2}, {3, 4} }; 
+0

Puoi fornire un preventivo standard che giustifichi la presenza di un solo paio di parentesi? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –