Maison  >  Article  >  développement back-end  >  Pourquoi GCC ne parvient-il pas à initialiser std :: array avec les listes d'initialisation ?

Pourquoi GCC ne parvient-il pas à initialiser std :: array avec les listes d'initialisation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 04:41:02640parcourir

Why Does GCC Fail to Initialize std::array with Initialization Lists?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn