Heim >Backend-Entwicklung >C++ >Warum funktioniert ein privater Standardkonstruktor in C, wenn er mit geschweiften Klammern verwendet wird, schlägt jedoch bei Klammern fehl?

Warum funktioniert ein privater Standardkonstruktor in C, wenn er mit geschweiften Klammern verwendet wird, schlägt jedoch bei Klammern fehl?

Susan Sarandon
Susan SarandonOriginal
2024-11-11 14:00:03415Durchsuche

Why does a private default constructor in C   work when used with curly braces but fail with parentheses?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn