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 à l'aide de la syntaxe suivante échouent :
std::array<:string> strings = { "a", "b" };
std::array<:string> strings({ "a", "b" });
Malgré les listes d'initialisation fonctionnant avec std::vector, ce comportement avec std::array a augmenté questions sur la norme C ou sur un problème potentiel avec GCC.
std::array's Inner Workings
std::array est essentiellement une structure qui encapsule un tableau. Sa structure ressemble à :
template
struct std::array {
T a[size];
};
Contrairement à std::vector, qui a un constructeur acceptant les listes d'initialisation, std::array ne dispose pas d'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égation en C 11. En tant que tel, il peut être agrégé initialisé. Cependant, pour initialiser le tableau dans la structure, un jeu supplémentaire d'accolades est requis :
std::array<:string> strings = {{ "a", "b" }};
Bogue potentiel de GCC
La norme C permet l'omission des 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3