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; }
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};
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!