Maison >développement back-end >C++ >Pourquoi l'initialisation de std::array avec une liste d'initialisation provoque-t-elle une erreur de compilation dans GCC 4.6.1 ?
Utilisation de std::array avec des listes d'initialisation : une énigme du compilateur
Bien que la syntaxe d'utilisation des listes d'initialisation avec std::array puisse sembler simple, certains utilisateurs ont rencontré des difficultés en tentant de le mettre en œuvre. L'exemple fourni dans la question :
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>
entraîne une erreur de compilation dans GCC 4.6.1 en raison d'un jeton inattendu avant la virgule. Cette incohérence avec le comportement de std::vector, qui accepte les listes d'initialisation sans problème, a conduit à la confusion et à des spéculations sur la validité de la syntaxe.
Plonger dans la nature de std::array
Pour comprendre cet écart, il est essentiel d'examiner la définition de std::array:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
Comme le montre cette définition, std::array est essentiellement une structure qui renferme un tableau. Il lui manque un constructeur qui accepte directement une liste d'initialisation. Cependant, selon les règles de C 11, std::array est considéré comme un agrégat. Cela permet une initialisation globale, ce qui implique l'initialisation indirecte des éléments du tableau.
Surmonter l'énigme de la syntaxe
Pour initialiser avec succès un std::array à l'aide de l'initialisation globale, un jeu supplémentaire d'accolades est requis :
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
En imbriquant les accolades, le compilateur reconnaît l'intention d'initialiser les éléments du tableau dans la structure. Cela élimine l'erreur de compilation rencontrée avec le premier exemple.
Bogues GCC ou irrégularités standard ?
Fait intéressant, la norme C implique que les accolades supplémentaires pourraient être omises dans cet exemple. cas précis. Par conséquent, il est probable que GCC 4.6.1 rencontre un bug qui empêche la bonne interprétation de la syntaxe simplifiée.
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!