Constructeurs privés et initialisation d'agrégat : une interaction inattendue
En C , déclarer un constructeur par défaut comme privé amènerait naturellement à supposer que le la construction par défaut du type associé deviendrait inaccessible. Cependant, un comportement particulier apparaît lors de l'utilisation de la syntaxe d'initialisation entre accolades.
Considérez l'exemple suivant :
class C { C() = default; }; int main() { C c; // error: C::C() is private auto c2 = C(); // error: calling a private constructor }
De manière inattendue, le code ci-dessus génère des erreurs sur tous les principaux compilateurs. C'est un comportement attendu car le constructeur par défaut est effectivement déclaré privé. Cependant, l'utilisation d'une initialisation entre accolades permet soudainement la construction par défaut :
int main() { C c{}; // OK auto c2 = C{}; // OK }
La raison derrière ce comportement inattendu réside dans les subtilités de la bibliothèque standard C. Selon la norme C 14 (8.4.2/5), une fonction est considérée comme « fournie par l'utilisateur » si elle est déclarée par l'utilisateur et qu'elle n'est pas explicitement définie par défaut ou supprimée lors de sa première déclaration.
Dans le cas de la classe C ci-dessus, le constructeur par défaut est explicitement défini par défaut lors de sa première déclaration. Cela signifie qu'il n'est pas considéré comme « fourni par l'utilisateur ». Par conséquent, la classe C n'a pas de constructeurs fournis par l'utilisateur, ce qui en fait un agrégat selon la définition de 8.5.1/1 :
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
Par conséquent, l'initialisation entre accolades est autorisée pour le C classe, permettant une construction par défaut même si le constructeur est déclaré comme privé. Ce comportement peut être surprenant et entraîner des conséquences indésirables dans certains scénarios.
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!