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 ?
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&...) { } }; foo& operator<<(foo& f, bar const&) { 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!