Heim >Backend-Entwicklung >C++ >Warum funktioniert ein privater Standardkonstruktor in C, wenn er mit geschweiften Klammern verwendet wird, schlägt jedoch bei Klammern fehl?
Privater Schatten des Standardkonstruktors
Wenn ein Typ mit der Absicht deklariert wird, seinen Standardkonstruktor privat zu machen, kann die Verwendung des Standardschlüsselworts möglicherweise nicht erreicht werden gewünschte Ergebnis, wie im folgenden Codeausschnitt dargestellt:
class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above }
Überraschenderweise erzeugt dieser Code Fehler obwohl der Konstruktor explizit privat gemacht wurde. Der folgende Code wird jedoch erfolgreich kompiliert:
class C { C() = default; }; int main() { C c{}; // OK on all compilers auto c2 = C{}; // OK on all compilers }
Warum verhält sich der Konstruktor anders, wenn er mit geschweiften Klammern verwendet wird?
C 14 Default Constructor Defaultness
Der Schlüssel liegt im C 14-Standard (8.4.2/5 [dcl.fct.def.default]), die eine „vom Benutzer bereitgestellte“ Funktion als eine Funktion definiert, die „vom Benutzer deklariert und bei ihrer ersten Deklaration nicht explizit als Standardwert festgelegt oder gelöscht“ wird. Dies impliziert, dass der Standardkonstruktor in unserem Beispiel nicht als vom Benutzer bereitgestellt gilt, da er explizit als Standard festgelegt wurde.
Aggregate Constructor Illumination
Als Ergebnis hat die Klasse C Keine vom Benutzer bereitgestellten Konstruktoren. Es wird daher gemäß 8.5.1/1 [dcl.init.aggr] als Aggregat klassifiziert, das besagt, dass ein Aggregat „ein Array oder eine Klasse ohne vom Benutzer bereitgestellte Konstruktoren, ohne private oder geschützte nichtstatische Konstruktoren“ ist Datenelemente, keine Basisklassen und keine virtuellen Funktionen ermöglicht die Konstruktion mit geschweiften Klammern {}, selbst wenn sie über private Konstruktoren verfügen. Diese Regel soll die Initialisierung von Aggregaten wie Arrays und Strukturen vereinfachen, die normalerweise mehrere Mitglieder enthalten.
Daher kann der Konstruktor der Klasse C, obwohl er als privat markiert ist, dennoch in geschweiften Klammern verwendet werden, weil Die Klasse selbst wird als Aggregat betrachtet.
Das obige ist der detaillierte Inhalt vonWarum funktioniert ein privater Standardkonstruktor in C, wenn er mit geschweiften Klammern verwendet wird, schlägt jedoch bei Klammern fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!