Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens des erreurs de compilation lors de l'initialisation d'un std::array avec une liste d'initialisation ?

Pourquoi est-ce que j'obtiens des erreurs de compilation lors de l'initialisation d'un std::array avec une liste d'initialisation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 08:15:30728parcourir

Why Do I Get Compilation Errors When Initializing a std::array with an Initializer List?

Utilisation de std::array avec des listes d'initialisation : résoudre le mystère de la syntaxe

Dans le domaine des structures de données C, std::array est avec son allocation de mémoire de taille fixe. Bien que sa polyvalence permette l'initialisation à l'aide de listes d'initialisation, certains défis inattendus peuvent survenir.

L'énigme de la syntaxe

Selon la requête, les tentatives d'initialisation d'un std::array l'utilisation de listes d'initialisation, comme illustré ci-dessous, entraîne des erreurs de compilation :

<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });</code>

Cependant, les listes d'initialisation fonctionnent de manière transparente avec std::vector. Cette disparité soulève la question : s'agit-il d'un malentendu sur les capacités de std::array ou d'un défaut dans l'implémentation de la bibliothèque GNU Standard C ?

Dévoilement de la solution

Derrière le scènes, std::array est construit comme une struct:

<code class="cpp">template<typename T, int size>
struct std::array
{
  T a[size];
};</code>

Cette structure encapsule un tableau, mais curieusement, il lui manque un constructeur qui accepte une liste d'initialisation. Néanmoins, puisque std::array est considéré comme un agrégat en C 11, l'initialisation de l'agrégat devient une approche alternative.

Pour réaliser l'initialisation de l'agrégat, un jeu supplémentaire d'accolades est requis pour cibler le tableau dans la structure :

<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>

Anomalies du compilateur

La norme C suggère que les accolades supplémentaires dans l'exemple ci-dessus sont inutiles. Cependant, l'erreur du compilateur rencontrée suggère un bug potentiel dans l'implémentation de GCC, qui ne parvient pas à reconnaître l'initialisation globale.

Conclusion

Bien que ce problème puisse sembler déroutant au premier abord En un coup d'œil, la clé réside dans la compréhension de la structure sous-jacente de std::array et des subtilités de l'initialisation globale. La syntaxe à double accolade résout les erreurs de compilation et permet la création de std::arrays à l'aide de listes d'initialisation, comme prévu par le standard C.

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