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
Libérer: 2024-12-07 03:42:11
original
367 Les gens l'ont consulté

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

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

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

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

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!

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