C++11: Korrigieren von std::array-Initialisierung?
Wenn ich initialisieren std::array wie folgt, der compiler gibt mir eine Warnung über fehlende Klammern
std::array<int, 4> a = {1, 2, 3, 4};
Dieser 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 einfach nur ein bug in meiner version von gcc, oder ist es absichtlich getan? Wenn ja, warum?
std::array
ist ein Aggregat. Ich denke, Sie könnte es mit einem Satz in die Zukunft, jedoch.Was genau meinst du damit?
Nun, wissen Sie, wie Sie
struct S {int i; int j;};
und initialisieren Sie es mit S s = {5, 6};
? Das Aggregat Initialisierung. std::array
enthält einen built-in-array, das kann initialisiert werden, über eine Initialisierungsliste, die ist, was die innere festgelegt ist. Die äußeren set ist für Aggregat-Initialisierung.Also in meinem Fall "{1, 2, 3, 4}" ist nur eine std::initializer_list Objekt, das sich innerhalb der eigentlichen Initialisierung Klammern?
Nun, ich bin nicht allzu sicher, wie built-in-array-Initialisierer-Listen behandelt werden, nachdem die Einführung dieses Typs, aber das ist das wesentliche, ja. Ist für die Klasse, und die andere ist für das array innerhalb der Klasse.
InformationsquelleAutor Byzantian | 2013-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist mit der bloßen Umsetzung von
std::array
:Es ist ein Aggregat, dessen Struktur nur Daten Mitglied ist ein traditionelles array, so dass die innere
{}
dient zum initialisieren des inneren array.Klammer elision erlaubt ist, in bestimmten Fällen mit Aggregat-Initialisierung (in der Regel aber nicht empfohlen) und so nur eine Klammer kann in diesem Fall verwendet werden. Siehe hier: C++ Vektor von arrays
Oh, du hast Recht! Ich wusste nicht,.
Huh, blöde GCC Warnungen >.> ich war nicht bewusst, dass es der Fall war bereits.
Ich hatte das gleiche problem (2016 jetzt), aber ich fixierte es mit dieser syntax: 'std::array<int,4> a[] = {1,2,3,4};' Also ich habe den Klammern anstelle von geschachtelten geschweiften Klammern. Weiss vielleicht jemand, warum diese Variante für mich gearbeitet?
Das hat eine andere Bedeutung. Die syntax, die Sie geschrieben wird, erstellen Sie ein array von std::arrays (ein 2-dimensionales array), anstatt ein einzelnes array (1-dimensional).
InformationsquelleAutor Pubby
Laut cppreference. Doppelte Klammern sind nur erforderlich, wenn
=
weggelassen wird.nur, wenn dein compiler implementiert, DR #1270 das hebt diese Einschränkung auf.
Aber warum macht es mir eine Warnung für "std::array<int, 4> eine = {1, 2, 3, 4}" dann?
Es ist nur eine gefälschte Warnung.
Sie können trivial befriedigen, mit dem zusätzlichen Klammern. Es ist nicht nur ärgerlich, warn-GCC hat (jemals gesehen
suggest parentheses around ‘&&’ within ‘||’
?)InformationsquelleAutor Draco Ater
Doppel-Klammern erforderlich, die in C++11, aber nicht, da C++14:
std::array-Referenz
InformationsquelleAutor Amit G.