Usando std :: array con gli elenchi di inizializzazione

A meno che non mi sbagli, dovrebbe essere ansible creare uno std: array in questi modi:

std::array strings = { "a", "b" }; std::array strings({ "a", "b" }); 

Eppure, usando GCC 4.6.1 non riesco a far funzionare nessuno di questi. Il compilatore dice semplicemente:

 expected primary-expression before ',' token 

eppure gli elenchi di inizializzazione funzionano bene con std :: vector. Quindi qual è? Sto sbagliando per pensare che std :: array dovrebbe accettare gli elenchi di inizializzazione, o il gruppo GNU Standard C ++ Library è ingannato?

std::array è divertente. È definito fondamentalmente in questo modo:

 template struct std::array { T a[size]; }; 

È una struttura che contiene un array. Non ha un costruttore che prende un elenco di inizializzazione. Ma std::array è un aggregato dalle regole di C ++ 11, e quindi può essere creato dall’inizializzazione di aggregati. Per aggregare l’inizializzazione dell’array all’interno della struttura, è necessario un secondo set di parentesi graffe:

 std::array strings = {{ "a", "b" }}; 

Si noti che lo standard suggerisce che in questo caso è ansible elidere le parentesi graffe aggiuntive. Quindi è probabile che sia un bug GCC.

Per aggiungere alla risposta accettata:

 std::array a1{'a', 'b'}; std::array a2 = {'a', 'b'}; std::array a3{{'a', 'b'}}; std::array a4 = {{'a', 'b'}}; 

tutto funziona su GCC 4.6.3 (Xubuntu 12.01). Però,

 void f(std::array a) { } //f({'a', 'b'}); //doesn't compile f({{'a', 'b'}}); 

quanto sopra richiede la doppia parentesi da compilare. La versione con singole parentesi restituisce il seguente errore:

 ../src/main.cc: In function 'int main(int, char**)': ../src/main.cc:23:17: error: could not convert '{'a', 'b'}' from '' to 'std::array' 

Non sono sicuro di quale aspetto dell’inferenza / conversione del tipo faccia in modo che le cose funzionino in questo modo, o se questo è un capriccio dell’implementazione di GCC.