Listes d'initialisation et std::array : un bug GCC
La classe std::array de la bibliothèque standard C fournit un correctif conteneur de tableau de taille. Il est communément admis que cette classe prend en charge les listes d'initialisation.
Cependant, avec GCC 4.6.1, les tentatives d'initialisation des instances std::array en utilisant la syntaxe suivante échouent :
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" }; std::array<std::string, 2> strings({ "a", "b" });</code>
Malgré les listes d'initialisation en travaillant avec std::vector, ce comportement avec std::array a soulevé des questions sur la norme C ou un problème potentiel de GCC.
Fonctionnement interne de std::array
std::array est essentiellement une structure qui encapsule un tableau. Sa structure ressemble à :
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
Contrairement à std::vector, qui a un constructeur acceptant les listes d'initialisation, std::array n'a pas un tel constructeur.
Initialisation globale
Bien que std::array n'ait pas de constructeur explicite pour les listes d'initialisation, il est considéré comme un type d'agrégat en C 11. En tant que tel, il peut être initialisé par agrégat. Cependant, pour initialiser le tableau dans la structure, un jeu supplémentaire d'accolades est requis :
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
Bug potentiel de GCC
La norme C permet l'omission de les accolades supplémentaires dans une telle initialisation. Par conséquent, il est probable que l'incapacité de GCC à gérer cette syntaxe sans eux soit un bug.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!