Maison > développement back-end > C++ > Quand omettre les accolades externes dans les listes d'initialisation C ?

Quand omettre les accolades externes dans les listes d'initialisation C ?

Barbara Streisand
Libérer: 2024-12-17 09:27:24
original
639 Les gens l'ont consulté

When to Omit Outer Braces in C   Initializer Lists?

Lors de l'omission des accolades externes dans les listes d'initialisation

En C, lors de l'initialisation d'un type d'agrégat tel qu'une structure ou un tableau, vous pouvez être confronté au question de savoir s'il faut ou non utiliser des accolades externes dans la liste d'initialisation. Dans le cas de types d'agrégats POD (Plain Old Data) et n'ayant aucun constructeur défini par l'utilisateur, tels que std::array, des accolades externes sont requises. Cependant, pour les agrégats qui n'ont pas cette restriction, comme les types intégrés, ces accolades peuvent être omises.

Accolades explicites pour les agrégats POD

Dans votre exemple, std :: tableau a1 nécessite des accolades explicites car std::array est un agrégat et un type POD. Le premier membre de l'agrégat est un tableau de taille N, où N est passé comme argument de modèle. Pour initialiser ce membre directement, vous devez utiliser des accolades supplémentaires pour le tableau interne. Dans votre exemple de code incorrect :

std::array<A, 2> a1 = 
{
  {0, 0.1},
  {2, 3.4}
};
Copier après la connexion

le compilateur signale "trop ​​d'initialiseurs" car les accolades internes sont manquantes. L'initialisation correcte avec des accolades est :

std::array<A, 2> a1 = 
{
  {{
    {0, 0.1},
    {2, 3.4}
  }}
};
Copier après la connexion

Élimination des accolades pour les agrégats non-POD

Contrairement aux agrégats POD, les agrégats non-POD comme les types intégrés ne nécessitent pas d'accolades externes explicites dans les listes d'initialisation. Par exemple, votre exemple :

std::array<double, 2> a2 = {0.1, 2.3};
Copier après la connexion

n'inclut pas d'accolades pour le tableau interne. En effet, double n'est pas un agrégat et la liste d'initialisation initialise directement les éléments doubles constitutifs.

Informations supplémentaires de la norme

La norme C fournit des indications sur le moment où les accolades extérieures peuvent être omises dans les listes d'initialisation :

  • Si la liste d'initialisation commence par une accolade gauche, alors tous les membres de la liste d'initialisation Le sous-agrégat est initialisé et des accolades supplémentaires ne sont pas nécessaires.
  • Si la liste d'initialisation ne commence pas par une accolade gauche, seulement suffisamment de clauses d'initialisation sont extraites de la liste pour remplir le sous-agrégat actuel, et toutes les clauses restantes initialiser le membre suivant de l'agrégat.

Cela permet l'initialisation avec et sans accolades, à condition que le nombre de clauses d'initialisation correspond au nombre de membres à initialiser.

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