Maison > développement back-end > C++ > Pourquoi les listes d'initialiseurs ne peuvent-elles pas être utilisées directement comme opérandes dans les expressions d'opérateurs binaires C ?

Pourquoi les listes d'initialiseurs ne peuvent-elles pas être utilisées directement comme opérandes dans les expressions d'opérateurs binaires C ?

DDD
Libérer: 2024-12-09 17:56:10
original
647 Les gens l'ont consulté

Why Can't Initializer Lists Be Used Directly as Operands in C   Binary Operator Expressions?

Listes d'initialisation dans les expressions d'opérateur : un dilemme

En C, les listes d'initialisation, entre accolades, constituent un moyen pratique d'initialiser les variables . Cependant, une question intrigante se pose lorsque l’on tente d’utiliser des listes d’initialiseurs dans des expressions d’opérateurs. Considérez le code suivant :

class foo { };

struct bar
{
    template<typename... T>
    bar(T const&...) { }
};

foo& operator<<(foo& f, bar const&) { return f; }

int main()
{
    foo baz;
    baz << {1, -2, "foo", 4, 5}; // This line gives an error
    return 0;
}
Copier après la connexion

Pourquoi ce code génère-t-il une erreur, notamment en ce qui concerne la ligne contenant l'expression baz << {1, -2, "foo", 4, 5} ;? La raison réside dans la définition des listes d'initialisation par la norme C.

Listes d'initialisation : une exception aux expressions

En vertu du §5 de la norme, les expressions sont définies avec précision. Étonnamment, les listes d’initialiseurs ne sont pas elles-mêmes considérées comme des expressions. Les opérateurs binaires, y compris <<, attendent des expressions comme arguments. Par conséquent, puisque les listes d'initialiseurs ne répondent pas à ce critère, elles ne peuvent pas être utilisées directement comme opérandes d'opérateurs binaires.

Exceptions limitées

La norme prévoit plusieurs exceptions pour les initialiseurs. utilisation de la liste, y compris comme arguments de fonction et dans les instructions d'affectation. Cependant, l'exception ne s'étend pas aux opérateurs binaires.

Raisons de la restriction

La justification de cette restriction est multiple. Selon le brouillon/document de discussion N2215, autoriser les listes d'initialiseurs comme opérandes d'opérateurs à gauche et à droite introduirait des complexités grammaticales qui mettraient à l'épreuve les analyseurs. Les auteurs de l'article ont finalement décidé qu'il serait trop fastidieux de les autoriser sur le côté droit mais pas sur le côté gauche.

Conclusion

Alors que les listes d'initialisation offrent une commodité dans certains contextes, leur utilisation restreinte à la droite des opérateurs découle de défis syntaxiques et d'un désir de cohérence dans la grammaire du langage. Au lieu des listes d'initialisation en tant qu'opérandes, on peut utiliser des invocations de constructeur ou des instances de barre de transmission directement comme arguments de l'opérateur<<(), comme le montre le code modifié :

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

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal