Wenn ein „privater“ Konstruktor in C öffentlich wird
In C schränkt die Deklaration des Standardkonstruktors eines Typs als privat normalerweise dessen Zugänglichkeit ein. In bestimmten Szenarien kann diese Einschränkung jedoch unerwartet umgangen werden.
Betrachten Sie das folgende Beispiel:
class C { C() = default; // Private default constructor }; int main() { C c; // Error: Constructor is private auto c2 = C(); // Error: Constructor is private }
In diesem Fall schlagen beide Versuche, Instanzen von C zu erstellen, aufgrund des privaten Konstruktors fehl . Überraschenderweise scheint diese Einschränkung aufgehoben zu sein, wenn geschweifte Klammern zur direkten Initialisierung von C verwendet werden:
class C { C() = default; }; int main() { C c{}; // Success: Curly braces allow object initialization auto c2 = C{}; // Success: Initialization not affected by private constructor }
Enthüllung des Tricks
Dieses eigenartige Verhalten ist auf die Aggregatinitialisierung von C 14 zurückzuführen Regeln. Gemäß 8.4.2/5 von [dcl.fct.def.default] gilt ein Standardkonstruktor nicht als „vom Benutzer bereitgestellt“, wenn er in seiner ersten Deklaration explizit als Standard angegeben wurde. Da der Standardkonstruktor von C diese Kriterien erfüllt, wird er nicht als vom Benutzer bereitgestellt behandelt.
Folglich erfüllt C die Definition eines Aggregats gemäß 8.5.1/1 von [dcl.init.aggr]: Es hat keine Vom Benutzer bereitgestellte Konstruktoren, private oder geschützte nicht statische Datenelemente, Basisklassen oder virtuelle Funktionen.
Aggregatinitialisierung
Ein Aggregat ist ein spezieller Typ mit vereinfachter Initialisierung Regeln. Geschweifte Klammern bedeuten in diesem Zusammenhang eine Aggregatinitialisierung, die die Erstellung eines Objekts auch mit privaten Konstruktoren ermöglicht. In unserem Fall behandelt der Compiler {} als Initialisierungsliste, umgeht die Einschränkung des privaten Konstruktors und initialisiert C als Aggregat.
Das obige ist der detaillierte Inhalt vonWarum ermöglicht die Verwendung von geschweiften Klammern die Initialisierung einer Klasse mit einem privaten Standardkonstruktor in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!