C++11: Corriger std::initialisation de tableau?
Si j'initialise un std::array comme suit, le compilateur me donne un avertissement manque des accolades
std::array<int, 4> a = {1, 2, 3, 4};
Cela résout le problème:
std::array<int, 4> a = {{1, 2, 3, 4}};
C'est le message d'avertissement:
missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]
Est-ce juste un bug de ma version de gcc, ou est-il intentionnel? Si oui, pourquoi?
std::array
est un agrégat. Je pense qu'ils peuvent être le faire fonctionner avec un ensemble à l'avenir, cependant.- Qu'est-ce exactement, voulez-vous dire par là?
- Eh bien, vous savez comment vous pouvez avoir
struct S {int i; int j;};
et l'initialiser à l'aide deS s = {5, 6};
? C'est agrégée d'initialisation.std::array
intègre une matrice, ce qui peut être initialisé par l'intermédiaire d'une liste d'initialiseur, qui est ce que l'intérieur est. L'extérieur est pour l'ensemble de l'initialisation. - Donc dans mon cas "{1, 2, 3, 4}" est juste un std::initializer_list objet qui lui-même doit être placé au sein de l'effectif de l'initialisation de l'appareil?
- Eh bien, je ne suis pas trop sûr de comment construit-dans la gamme de l'initialiseur listes sont traitées après l'introduction de ce type, mais c'est l'essentiel, oui. Pour la classe, et l'autre est pour le tableau à l'intérieur de la classe.
- Un C-array est un agrégat par définition. Étant donné que
std::array<>
est un aggreate aussi, la première accolade initialise lestd::arrat<>
, et la deuxième initialise l'intérieur C-tableau. - dup stackoverflow.com/q/8863319/981959 dup stackoverflow.com/q/11400090/981959
- Double Possible de Quand peut-externe accolades être omis dans un initialiseur de la liste?
Vous devez vous connecter pour publier un commentaire.
C'est le nu de la mise en œuvre de
std::array
:C'est un agrégat struct dont le seul membre de données est un traditionnel tableau, de telle sorte que l'intérieur
{}
est utilisé pour initialiser l'intérieur de la matrice.Corset élision est permis dans certains cas de l'agrégat d'initialisation (mais généralement pas recommandé) et donc, une seule entretoise peut être utilisé dans ce cas. Voir ici: C++ vecteur de tableaux
Selon cppreference. Double accolades sont obligatoires uniquement si
=
est omis.suggest parentheses around ‘&&’ within ‘||’
?)-Wno-missing-braces
. Ou attendre pour GCC 4.8 qui ne comprennent pas les-Wmissing-braces
dans-Wall
à cause de cettestd::array
question.Double-attaches nécessaire en C++11 avant le GTC 1270 (pas nécessaire en C++11, après la révision et en C++14 et au-delà):
std::array référence