Wenn ich ein std :: -Array wie folgt initialisiere, warnt mich der Compiler vor fehlenden geschweiften Klammern
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 dies nur ein Fehler in meiner Version von gcc oder wird es absichtlich gemacht? Wenn ja warum?
std::array
ist ein Aggregat. Ich denke jedoch, dass sie es in Zukunft mit einem Set zum Laufen bringen könnten.struct S {int i; int j;};
und initialisieren könnenS s = {5, 6};
? Das ist eine aggregierte Initialisierung.std::array
enthält ein eingebautes Array, das über eine Initialisierungsliste initialisiert werden kann. Dies ist die innere Menge. Der äußere Satz dient zur aggregierten Initialisierung.Antworten:
Dies ist die bloße Implementierung von
std::array
:template<typename T, std::size_t N> struct array { T __array_impl[N]; };
Es ist eine aggregierte Struktur, deren einziges Datenelement ein traditionelles Array ist, sodass das innere
{}
zum Initialisieren des inneren Arrays verwendet wird.Die Klammerelision ist in bestimmten Fällen mit aggregierter Initialisierung zulässig (wird jedoch normalerweise nicht empfohlen). Daher kann in diesem Fall nur eine Klammer verwendet werden. Siehe hier: C ++ - Vektor von Arrays
quelle
Nach cppreference . Doppelklammern sind nur erforderlich, wenn sie
=
weggelassen werden.// 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"} };
quelle
suggest parentheses around ‘&&’ within ‘||’
?)In C ++ 11 vor dem CWG 1270 sind doppelte Klammern erforderlich (in C ++ 11 nach der Überarbeitung und in C ++ 14 und darüber hinaus nicht erforderlich):
// construction uses aggregate initialization std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision // (not needed in C++11 after the revision and in C++14 and beyond) std::array<int, 3> a2 = {1, 2, 3}; // never required after =
std :: array referenz
quelle
C ++ 17
std::array
Klassenvorlagenargumentabzug (CTAD)Diese neue C ++ 17-Funktion wird von der Standardbibliothek verwendet und ermöglicht es uns nun, auch die Vorlagentypen wegzulassen, damit Folgendes funktioniert:
main.cpp
#include <array> int main() { std::array a{1, 2, 3}; }
Anstatt von
std::array<int, 3> a{1, 2, 3};
Getestet mit:
g++ -ggdb3 -O0 -std=c++17 -Wall -Wextra -pedantic -o main.out main.cpp
Wenn wir
-std=c++14
stattdessen zum Beispiel setzen, kann es nicht kompiliert werden mit:error: missing template arguments before ‘a’
Siehe auch: Größe von std :: array ableiten?
Getestet unter Ubuntu 18.04, GCC 7.5.0.
quelle