Maison >développement back-end >C++ >Pourquoi des accolades supplémentaires sont-elles parfois nécessaires dans les listes d'initialisation C ?

Pourquoi des accolades supplémentaires sont-elles parfois nécessaires dans les listes d'initialisation C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-04 14:18:14807parcourir

Why Are Extra Braces Sometimes Necessary in C   Initializer Lists?

Lorsque des accolades supplémentaires sont requises dans une liste d'initialisation

En C , les listes d'initialisation constituent un moyen pratique d'initialiser un objet agrégé ou un tableau. Cependant, lorsque vous travaillez avec certaines structures de données telles que std::array et les structures agrégées, la syntaxe nécessite des accolades supplémentaires, laissant de nombreux programmeurs se demander pourquoi.

Le besoin d'accolades supplémentaires dans std::array

std::array est un conteneur de taille fixe déclaré comme type de données agrégées, ce qui signifie qu'il n'a pas de constructeur défini par l'utilisateur. En tant qu'agrégat, std::array initialise directement ses membres, y compris le tableau interne.

Pour initialiser directement le tableau interne, des accolades supplémentaires sont nécessaires. Prenons l'exemple suivant :

std::array<int, 2> a1 = {{0, 1}, {2, 3}};

Ici, les accolades autour de {0, 1} et {2, 3} sont essentielles car elles indiquent que l'initialisation concerne le tableau interne dans a1. Sans ces accolades, le code produirait une erreur de compilation en raison d'un trop grand nombre d'initialiseurs.

Manque d'accolades supplémentaires pour les types de base

Contrairement à std::array, les types de base comme double ne le font pas nécessitent des accolades supplémentaires dans les listes d'initialisation. C’est parce qu’il ne s’agit pas d’agrégats. Par exemple :

std::array<double, 2> a2 = {0.1, 2.3};

Dans ce cas, a2 est un tableau de valeurs doubles. Puisque double n'est pas un agrégat, l'initialisation n'implique aucun tableau interne et les accolades supplémentaires ne sont pas nécessaires.

Autres exemples

L'exigence d'accolades supplémentaires s'étend au-delà de std::array . D'autres types impliquant des agrégats en nécessitent également. Par exemple :

struct B { int foo[2]; };
B meow1 = {1, 2};   // OK (fully-braced)
B bark1 = {{1, 2}}; // OK (extra braces for inner aggregate)

struct C { int a, b; };
C meow2 = {1, 2};    // OK (completely elided braces)
C bark2 = {{1, 2}}; // OK (extra braces for inner aggregate)

struct D { int foo[2]; };
D meow3 = {{1, 2}, {3, 4}};    // error (neither braced-elided nor fully-braced)
D bark3 = {{{1, 2}, {3, 4}}}; // OK (extra braces for inner aggregate)

Conclusion

Pour résumer, des accolades supplémentaires sont requises dans les listes d'initialisation lors de l'initialisation d'agrégats comme std::array et certaines structures car elles dénotent l'initialisation du tableau interne ou les membres de l'agrégat. Comprendre cette distinction est crucial pour éviter les erreurs de compilation et garantir la bonne initialisation de telles structures de données.

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