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!