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
Libérer: 2024-10-29 08:15:30
original
697 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal