2013-01-06 17 views
42

Se io inizializzare uno std :: array come segue, il compilatore mi dà un avvertimento circa le parentesi mancantiC++ 11: corretta l'inizializzazione di std :: array?

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

questo risolve il problema:

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

Questo è il messaggio di avviso:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces] 

Questo è solo un bug nella mia versione di gcc o è stato fatto intenzionalmente? Se è così, perché?

+1

'std :: array' è un aggregato. Penso che potrebbero farlo funzionare con un set in futuro, comunque. – chris

+0

@chris Che cosa intendi esattamente? – CaffeineAddict

+3

Bene, sai come si può avere 'struct S {int i; int j;}; 'e inizializza usando' S s = {5, 6}; '? Questa è l'inizializzazione aggregata. 'std :: array' contiene un array incorporato, che può essere inizializzato tramite un elenco di inizializzazione, che è ciò che è l'insieme interno. L'insieme esterno è per l'inizializzazione aggregata. – chris

risposta

40

Questa è la nuda attuazione std::array:

template<typename T, std::size_t N> 
struct array { 
    T __array_impl[N]; 
}; 

È un aggregato struct cui membro dati è solo una matrice tradizionale, in modo che quello interno {} viene utilizzato per inizializzare l'array interno.

L'elisione di controvento è consentita in alcuni casi con l'inizializzazione di aggregazione (ma in genere non è consigliabile) e pertanto in questo caso è possibile utilizzare solo un controvento. Vedi qui: C++ vector of arrays

+0

Tutte le versioni dello standard consentono di eseguire il comando elision. – Cubbi

+0

@Cubbi Oh, hai ragione! Non ho capito. – Pubby

+0

Huh, stupidi avvertimenti del GCC>.> Non ero a conoscenza che fosse già il caso. – chris

24

Secondo cppreference. Le doppie parentesi sono richieste solo se si omette =.

// construction uses aggregate initialization 
std::array<int, 3> a1{ {1,2,3} }; // double-braces required 
std::array<int, 3> a2 = {1, 2, 3}; // except after = 
std::array<std::string, 2> a3 = { {std::string("a"), "b"} }; 
+0

std :: array un {1, 2, 3, 4} sembra funzionare correttamente. – CaffeineAddict

+4

@cyberpunk_ solo se il compilatore implementato [DR # 1270] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1270) che solleva tale restrizione. – Cubbi

+0

@Chubbi Ma perché mi dà un avvertimento per "std :: array a = {1, 2, 3, 4}" allora? – CaffeineAddict

Problemi correlati