Maison > Article > développement back-end > Pourquoi l'utilisation d'accolades permet-elle l'initialisation d'une classe avec un constructeur privé par défaut en C ?
Quand un constructeur "privé" en C devient public
En C , déclarer le constructeur par défaut d'un type comme privé restreint généralement son accessibilité. Cependant, dans certains scénarios, cette restriction peut être contournée de manière inattendue.
Considérez l'exemple suivant :
class C { C() = default; // Private default constructor }; int main() { C c; // Error: Constructor is private auto c2 = C(); // Error: Constructor is private }
Dans ce cas, les deux tentatives de création d'instances de C échouent en raison du constructeur privé . Étonnamment, cette restriction semble être levée lors de l'utilisation d'accolades pour initialiser C directement :
class C { C() = default; }; int main() { C c{}; // Success: Curly braces allow object initialization auto c2 = C{}; // Success: Initialization not affected by private constructor }
Dévoilement de l'astuce
Ce comportement particulier découle de l'initialisation globale de C 14. règles. Conformément à 8.4.2/5 de [dcl.fct.def.default], un constructeur par défaut n'est pas considéré comme "fourni par l'utilisateur" s'il a été explicitement défini par défaut dans sa première déclaration. Étant donné que le constructeur par défaut de C répond à ces critères, il n'est pas traité comme fourni par l'utilisateur.
Par conséquent, C répond à la définition d'un agrégat selon 8.5.1/1 de [dcl.init.aggr] : il n'a pas constructeurs fournis par l'utilisateur, données membres non statiques privées ou protégées, classes de base ou fonctions virtuelles.
Initialisation de l'agrégat
Un agrégat est un type spécial avec une initialisation simplifiée règles. Dans ce contexte, les accolades signifient une initialisation globale, qui permet la création d'un objet même avec des constructeurs privés. Dans notre cas, le compilateur traite {} comme une liste d'initialisation, contournant la restriction du constructeur privé et initialisant C comme un agrégat.
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!