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 ?

Pourquoi l'initialisation de std::array avec une liste d'initialisation provoque-t-elle une erreur de compilation dans GCC 4.6.1 ?

DDD
DDDoriginal
2024-10-29 09:51:30579parcourir

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in 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!

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