Quand un constructeur privé n'est-il pas un constructeur privé ?
En C, rendre un constructeur privé semble être un moyen simple d'empêcher la création d'objets en dehors de la classe. Cependant, un comportement inattendu se produit lorsqu'un constructeur par défaut est déclaré privé.
Considérez le code suivant :
class C { C() = default; }; int main() { C c; // Error: Private constructor auto c2 = C(); // Error: Private constructor }
Étonnamment, ce code ne parvient pas à se compiler en raison du constructeur privé par défaut. Cependant, le code suivant :
class C { C() = default; }; int main() { C c{}; // Compiles auto c2 = C{}; // Compiles }
compile avec succès.
La raison de ce comportement particulier réside dans le standard C. Selon 8.4.2/5 [dcl.fct.def.default], une fonction n'est pas fournie par l'utilisateur si elle est explicitement définie par défaut lors de sa première déclaration. Par conséquent, dans notre exemple initial, le constructeur par défaut n'est pas fourni par l'utilisateur.
Ce manque de constructeurs fournis par l'utilisateur fait de la classe C un agrégat selon 8.5.1/1 [dcl.init.aggr], qui :
Pour les agrégats, la syntaxe entre accolades-init est considérée comme un appel de constructeur et non comme une déclaration, c'est pourquoi elle réussit dans ce dernier extrait de code.
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!