Prévention de l'ambiguïté dans les initialiseurs en classe
Pourquoi les initialiseurs en classe sont-ils limités à être placés entre accolades ou à utiliser le opérateur d'affectation (=) ? Contrairement aux déclarations de méthode, qui peuvent utiliser des parenthèses, les initialiseurs en classe doivent adhérer à cette syntaxe spécifique.
Justification de la restriction
Cette limitation vise à contourner les erreurs syntaxiques potentielles. ambiguïté. Considérez la définition de classe suivante :
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing(Overloaded); // Function declaration or data member initialization? };
Si les parenthèses étaient autorisées pour les initialiseurs en classe, ce code conduirait à une ambiguïté. D'une part, la ligne "int confusion(Overloaded);" pourrait être interprété comme une déclaration de fonction acceptant un paramètre de type Overloaded et renvoyant un int. D'un autre côté, il peut également être lu comme une initialisation de membre de données de type int avec la valeur du membre de données surchargé. (Cela concerne le problème notoire de « l'analyse la plus vexante ».)
Éliminer l'ambiguïté avec les accolades
En imposant l'utilisation d'accolades, cette ambiguïté est éliminée :
class BadTimes { struct Overloaded; int Overloaded; // Strange but legal data member int confusing{Overloaded}; // Clearly a data member initialization };
Maintenant, il est évident que confusion est un int explicitement initialisé à la valeur de Overloaded, car il n'est pas possible de l'interpréter comme une déclaration de fonction.
Cette restriction syntaxique garantit des définitions de classe claires et sans ambiguïté, évitant ainsi les conséquences involontaires résultant d'une confusion syntaxique.
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!