Maison >développement back-end >C++ >Pourquoi les initialiseurs en classe sont-ils limités aux accolades ou à l'opérateur d'affectation ?

Pourquoi les initialiseurs en classe sont-ils limités aux accolades ou à l'opérateur d'affectation ?

DDD
DDDoriginal
2024-12-21 06:43:14460parcourir

Why Are In-Class Initializers Restricted to Curly Braces or the Assignment Operator?

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!

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