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 ?

Pourquoi l'utilisation d'accolades permet-elle l'initialisation d'une classe avec un constructeur privé par défaut en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-20 03:06:02127parcourir

Why Does Using Curly Braces Allow Initialization of a Class with a Private Default Constructor in 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!

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