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

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

Barbara Streisand
Barbara Streisandoriginal
2024-12-13 21:17:12428parcourir

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

Listes d'initialisations et côté droit des opérateurs

Considérez l'extrait de code suivant :

class foo { };

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

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

int main()
{
    foo baz;
    baz << {1, -2, "foo", 4, 5};

    return 0;
}

Compilateurs se plaindre de l'utilisation d'une liste d'initialisation sur le côté droit (RHS) de l'opérateur <<. Cela soulève des questions sur les raisons pour lesquelles cela est interdit en C , par opposition aux cas où les listes d'initialisation sont utilisées dans les arguments de fonction.

Les listes et expressions d'initialisation

Les listes d'initialisation ne sont pas expressions telles que définies dans la norme C. Les arguments des fonctions et des opérateurs doivent généralement être des expressions. Cependant, la norme définit des exceptions pour les listes d'initialisation dans certains contextes, notamment en tant qu'arguments de fonction, indices et expressions d'affectation.

Aucune exception pour les opérateurs binaires

Il n'y a pas exception pour les listes d'initialiseurs à utiliser sur le RHS (ou le côté gauche) des opérateurs binaires. Cette interdiction découle des problèmes d'analyse qui surviennent lors de l'autorisation des listes d'initialiseurs en tant qu'expressions. L'utilisation d'accolades pour les listes d'initialisation et les blocs entraînerait une ambiguïté dans la grammaire.

Justification de la restriction

Une proposition visant à étendre l'utilisation des listes d'initialisation aux expressions a été envisagé en 2007. Cependant, il a été déterminé qu'autoriser les listes d'initialisation comme opérandes de droite des opérateurs binaires, mais pas comme opérandes de gauche, serait trop perturbateur pour la grammaire.

Conclusion

Les listes d'initialiseurs ne peuvent pas être utilisées sur le RHS des opérateurs car elles ne sont pas définies comme expressions dans le Standard. Bien que certaines exceptions existent pour leur utilisation dans des contextes spécifiques, les autoriser comme arguments d'opérateur généraux poserait des problèmes d'analyse importants en raison de l'utilisation d'accolades pour les listes d'initialisation et les blocs.

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!

Déclaration:
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