Maison > développement back-end > C++ > Pourquoi puis-je initialiser un agrégat avec un constructeur privé par défaut ?

Pourquoi puis-je initialiser un agrégat avec un constructeur privé par défaut ?

DDD
Libérer: 2024-11-15 12:21:03
original
689 Les gens l'ont consulté

Why Can I Initialize an Aggregate with a Private Default Constructor?

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
}
Copier après la connexion

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
}    
Copier après la connexion

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).
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal