Maison >développement back-end >C++ >Quand utiliser des accolades dans l'initialisation d'agrégat C avec des tableaux ?

Quand utiliser des accolades dans l'initialisation d'agrégat C avec des tableaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 03:42:11368parcourir

When to Use Braces in C   Aggregate Initialization with Arrays?

Syntaxe d'initialisation ambiguë pour les agrégats contenant des tableaux

En C , lors de l'initialisation d'agrégats contenant des tableaux, l'omission des accolades peut entraîner de la confusion et des erreurs. Cela est évident dans les exemples suivants :

// Error: Too many initializers
std::array<A, 2> a1 = {
    {0, 0.1},
    {2, 3.4}
};

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

Accolades requises pour std::array de structures

Le premier exemple génère une erreur car std::array est un agrégat et n'a pas de constructeur défini par l'utilisateur. L'initialisation de son tableau interne nécessite des accolades explicites, comme le montre la version corrigée :

std::array<A, 2> a1 = {
    {{0, 0.1}, {2, 3.4}}
};

Braces Not Required for std::array of PODs

En revanche, std :: tableau dans le deuxième exemple, ne nécessite pas d'accolades car double est un type de données Plain Old (POD) et l'initialisation du tableau est efficacement gérée par l'initialiseur par défaut.

Cohérence des agrégats

Le principe d'exiger des entretoises pour les membres de l'agrégat s'applique à d'autres types d'agrégats comme eh bien :

// Valid
B meow1 = {1, 2};
B bark1 = {{1, 2}};

C meow2 = {1, 2};
C bark2 = {{1, 2}};

Ambiguïté en D

Cependant, l'exemple suivant conduit à une erreur :

// Error: Too many initializers
D meow3 = {{1, 2}, {3, 4}};
D bark3 = {{{1, 2}, {3, 4}}};

En D, l'initialiseur car foo est lui-même un tableau. Les accolades dans meow3 sont ambiguës car elles pourraient faire référence soit à l'initialisation de foo, soit à son tableau interne. Pour résoudre l'ambiguïté, des accolades explicites sont nécessaires, comme dans bark3.

Mécanisme d'initialisation des agrégats

Lorsque les accolades sont omises lors de l'initialisation des agrégats, plusieurs règles s'appliquent :

  1. Si l'initialiseur d'un agrégat de membres commence par une accolade, il est traité comme une initialisation entièrement entre accolades, et tous les membres entre accolades sont initialisés.
  2. Si l'initialiseur ne commence pas par une accolade, seul le nombre suffisant d'initialiseurs est extrait de la liste pour initialiser les membres de l'agrégat ; tous les initialiseurs restants sont utilisés pour le membre suivant de l'agrégat parent.

Exemples supplémentaires

  • Initialisation entièrement renforcée : {{1, 3, 5}, {2, 4, 6}, {3, 5, 7} >
  • Accolades élidées pour l'agrégat interne : { 1, 3, 5, 2, 4, 6, 3, 5, 7 >
  • Syntaxe ambiguë : {{1, 3, 5}, {2, 4, 6}, 3, 5, 7 } (ni entièrement appareillé, ni appareil dentaire élidé)

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