Maison > développement back-end > C++ > Pourquoi ne puis-je pas utiliser des initialiseurs désignés pour initialiser les membres hérités dans C 20 ?

Pourquoi ne puis-je pas utiliser des initialiseurs désignés pour initialiser les membres hérités dans C 20 ?

Barbara Streisand
Libérer: 2024-10-28 17:13:02
original
597 Les gens l'ont consulté

Why can't I use designated initializers to initialize inherited members in C  20?

Initialiseurs désignés en C 20 : compréhension des restrictions

En C 20, les initialiseurs désignés constituent un moyen pratique d'initialiser des membres spécifiques d'un agrégat. Cependant, ces initialiseurs ont certaines limitations.

Considérez l'exemple de code fourni :

<code class="cpp">struct Person
{
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error
    Employee e2{.salary{55000}}; // Warning
}</code>
Copier après la connexion

Comme indiqué dans le code, Person et Employee sont des agrégats. Cependant, l'initialisation de l'agrégat Employee à l'aide des initialiseurs désignés (e1) ne parvient pas à se compiler. Pourquoi ?

La réponse réside dans la norme C 20, plus précisément dans la section 9.3.1 Agrégats, point 3.1 :

"Si la liste d'initialiseurs est une liste d'initialiseurs désignés, le L'agrégat doit être de type classe, l'identifiant dans chaque désignateur doit nommer un membre de données non statique direct de la classe, et les éléments explicitement initialisés de l'agrégat sont les éléments qui sont ou contiennent ces membres. "

En d'autres termes, les initialiseurs désignés ne peuvent être utilisés que pour initialiser les membres de la classe actuelle. Ils ne peuvent pas être utilisés pour les membres hérités ou les membres de la classe de base. Cette restriction est la raison pour laquelle l'initialisation de e1 n'est pas valide.

Pour initialiser e1 correctement, on peut utiliser la syntaxe habituelle d'initialisation de liste :

<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>
Copier après la connexion

Alternativement, on peut utiliser une combinaison de désigné et initialiseurs non désignés pour obtenir le même résultat :

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 }; // Also works</code>
Copier après la connexion

Dans ce cas, la classe de base directe (Personne) est initialisée à l'aide d'une liste d'initialiseurs désignée, tandis que la classe Employee entière est initialisée à l'aide d'un initialiseur non désigné liste d'initialiseurs.

Dans l'ensemble, il est important de se rappeler les limites des initialiseurs désignés lorsque l'on travaille avec des hiérarchies de classes en C 20. En utilisant la syntaxe d'initialisation appropriée, on peut initialiser efficacement et avec précision les données membres des classes de base et dérivé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!

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