Maison > développement back-end > C++ > Pourquoi ne puis-je pas utiliser les listes d'initialisation sur le côté droit des opérateurs C ?

Pourquoi ne puis-je pas utiliser les listes d'initialisation sur le côté droit des opérateurs C ?

Mary-Kate Olsen
Libérer: 2024-12-09 01:19:13
original
701 Les gens l'ont consulté

Why Can't I Use Initializer Lists on the Right-Hand Side of C   Operators?

Surcharge d'opérateurs et listes d'initialisation sur RHS

En programmation C, les listes d'initialisation sont une syntaxe concise pour initialiser des objets agrégés avec une liste d'expressions . Bien que les listes d'initialisation puissent être facilement utilisées dans divers scénarios, leur utilisation sur le côté droit (RHS) des opérateurs a été un sujet de discussion.

Pourquoi les listes d'initialisation sont restreintes sur RHS

C 11 n'autorise pas les listes d'initialisation sur le RHS des opérateurs, y compris l'opérateur binaire << utilisé dans votre code. Il y a plusieurs raisons à cette restriction :

  • Les listes d'initialiseurs ne sont pas des expressions : Selon la norme C, les listes d'initialiseurs ne sont pas considérées comme des expressions. Les arguments des opérateurs binaires sont généralement des expressions, et la grammaire définie pour les expressions exclut les listes d'initialisation.
  • Défis de l'analyseur : Autoriser les listes d'initialisation sur le côté gauche (LHS) des opérateurs pose un défi grammatical . La grammaire standard des expressions pourrait devenir ambiguë si elle autorisait les listes d'initialisation dans les positions LHS et RHS.

Exceptions pour les listes d'initialisation

Malgré la restriction générale sur en utilisant des listes d'initialisation dans les arguments de l'opérateur, C définit des exceptions spécifiques où les listes d'initialisation sont acceptées :

  • Comme arguments aux fonctions
  • En tant qu'indices dans les expressions d'accès au tableau
  • En tant qu'arguments aux constructeurs
  • Dans les instructions de retour
  • En tant qu'initialiseur dans les définitions de variables

Dans votre code, vous pouvez utiliser une liste d'initialisation comme argument du constructeur bar, qui est appelé dans le ≪≪ opérateur :

foo baz;
baz << bar{1, -2, "foo", 4, 5}; // Legal
Copier après la connexion

Raisons de la restriction

La décision de restreindre les listes d'initialiseurs sur le RHS des opérateurs découle de la volonté de maintenir une grammaire cohérente et claire. Autoriser les listes d'initialisation dans tous les contextes aurait introduit une complexité supplémentaire et une ambiguïté potentielle dans le langage.

Comme indiqué dans le document de discussion mentionné dans votre question, l'alternative consistant à autoriser les listes d'initialisation sur le RHS mais pas sur le LHS a été envisagée. trop problématique. Par conséquent, l'approche conservatrice consistant à autoriser les listes d'initialisation uniquement dans des contextes spécifiques a été choisie.

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