Code:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Pourquoi ai-je besoin de doubles accolades pour std :: array?
Code:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Pourquoi ai-je besoin de doubles accolades pour std :: array?
std::array<T, N>
est un agrégat: il n'a pas tout utilisateur déclaré par les constructeurs, même pas de prendre un std::initializer_list
. Initialisation à l'aide de l'appareil est réalisée à l'aide d'agrégation de l'initialisation, une fonction de C++ qui a été hérité de C.
Le "old style" de l'ensemble de l'initialisation utilise l' =
:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
Avec ce vieux style de l'ensemble de l'initialisation, extra, les accolades peuvent être gommés, donc c'est équivalent à:
std::array<int, 4> y = { 1, 2, 3, 4 };
Cependant, ces accolades ne peut être ramené "dans une déclaration de la forme T x = { a };
" (C++11 §8.5.1/11), qui est, lorsque l'ancien style =
est utilisé . Cette règle autorisant l'accolade élision ne s'applique pas pour direct initialisation de la liste. Une note de bas de page ici se lit comme suit: "les Accolades ne peuvent être gommés dans les autres utilisations de la liste d'initialisation."
Il y a un rapport de défaut concernant cette restriction: GTC défaut #1270. Si le projet de résolution est adopté, brace élision sera autorisé pour les autres formes d'initialisation de la liste, et la suite sera bien formé:
std::array<int, 4> y{ 1, 2, 3, 4 };
(Astuce chapeau à la Ville Voutilainen pour trouver le rapport de défaut.)
Parce que std::vector
offre un constructeur qui prend en compte std::initializer_list<T>
, alors que std::array
n'a pas de constructeur et que la {1, 2, 3, 4}
initialisée-liste est en fait non interprétée comme un std::initializer_list
, mais une initialisation globale pour le tableau de style C interne de std::array
(d'où provient le second ensemble d'accolades: un pour std::array
, un pour le tableau de membres de style C interne).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.