2013-01-06 7 views
42

Wenn ich eine std :: Array initialisieren, gibt mir der Compiler eine Warnung über fehlende KlammernC++ 11: Richtige std :: Array-Initialisierung? wie folgt

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

Dies behebt das Problem:

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

Dies ist die Warnmeldung:

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

ist das nur ein Fehler in meiner Version von gcc, oder wird es absichtlich getan? Wenn ja warum?

+1

'std :: array' ist ein Aggregat. Ich denke, dass sie es in der Zukunft mit einem Set arbeiten lassen könnten. – chris

+0

@chris Was genau meinst du damit? – CaffeineAddict

+3

Nun, du weißt wie du 'struct S {int i; int j;}; 'und initialisiere es mit' S s = {5, 6}; '? Das ist die Aggregat-Initialisierung. 'std :: array' enthält ein eingebautes Array, das über eine Initialisiererliste initialisiert werden kann, was die innere Menge ist. Der äußere Satz dient zur Aggregat-Initialisierung. – chris

Antwort

40

Dies ist die bloße Anwendung von std::array:

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

Es ist ein Aggregat struct deren einziges Datenelement ist eine traditionelle Anordnung, so dass die inneren {} verwendet wird, um die innere Anordnung zu initialisieren.

Brace elision ist in bestimmten Fällen mit einem aggregierten Initialisierung (aber in der Regel nicht empfohlen) und so nur eine Strebe erlaubt in diesem Fall verwendet werden. Siehe hier: C++ vector of arrays

+0

Alle Versionen des Standards ermöglichen Klammer Elision. – Cubbi

+0

@Cubbi Oh, du hast Recht! Ich habe es nicht bemerkt. – Pubby

+0

Huh, blöde GCC-Warnungen>.> Mir war nicht bewusst, dass es schon der Fall war. – chris

24

Nach cppreference. Doppelte Klammern sind nur erforderlich, wenn = weggelassen wird.

// 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 a {1, 2, 3, 4} scheint gut zu funktionieren. – CaffeineAddict

+4

@cyberpunk_ nur, wenn Ihr Compiler implementiert [DR # 1270] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1270), die diese Beschränkung hebt. – Cubbi

+0

@Chubbi Aber warum gibt es eine Warnung für "std :: array a = {1, 2, 3, 4}" dann? – CaffeineAddict

Verwandte Themen