67 votes

c ++ pourquoi le comportement initializer_list de std :: vector et std :: array est différent

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?

61voto

James McNellis Points 193607

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.)

25voto

Xeo Points 69818

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.com

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.

Powered by:

X