Heim > Backend-Entwicklung > C++ > Warum kann ich ein Aggregat mit einem privaten Standardkonstruktor initialisieren?

Warum kann ich ein Aggregat mit einem privaten Standardkonstruktor initialisieren?

DDD
Freigeben: 2024-11-15 12:21:03
Original
682 Leute haben es durchsucht

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

Private Konstruktoren und Aggregatinitialisierung: Eine unerwartete Interaktion

In C würde die Deklaration eines Standardkonstruktors als privat natürlich zu der Annahme führen, dass der Die Standardkonstruktion des zugehörigen Typs wäre dann nicht mehr zugänglich. Allerdings tritt ein eigenartiges Verhalten auf, wenn die in geschweifte Klammern eingeschlossene Initialisierungssyntax verwendet wird.

Betrachten Sie das folgende Beispiel:

class C {
    C() = default;
};

int main() {
    C c;           // error: C::C() is private
    auto c2 = C(); // error: calling a private constructor
}
Nach dem Login kopieren

Unerwarteterweise generiert der obige Code Fehler auf allen wichtigen Compilern. Dies ist ein erwartetes Verhalten, da der Standardkonstruktor tatsächlich als privat deklariert ist. Die Verwendung einer in Klammern eingeschlossenen Initialisierung ermöglicht jedoch plötzlich eine Standardkonstruktion:

int main() {
    C c{};         // OK
    auto c2 = C{}; // OK
}    
Nach dem Login kopieren

Der Grund für dieses unerwartete Verhalten liegt in den Feinheiten der C-Standardbibliothek. Gemäß dem C 14-Standard (8.4.2/5) gilt eine Funktion als „vom Benutzer bereitgestellt“, wenn sie vom Benutzer deklariert und bei ihrer ersten Deklaration nicht explizit als Standardwert festgelegt oder gelöscht wird.

Im Fall von In der oben genannten C-Klasse wird der Standardkonstruktor bei seiner ersten Deklaration explizit voreingestellt. Dies bedeutet, dass es nicht als „vom Benutzer bereitgestellt“ gilt. Folglich verfügt die C-Klasse über keine vom Benutzer bereitgestellten Konstruktoren, was sie zu einem Aggregat gemäß der Definition in 8.5.1/1 macht:

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).
Nach dem Login kopieren

Daher ist die Initialisierung in geschweifte Klammern für C zulässig Klasse, die eine Standardkonstruktion ermöglicht, auch wenn der Konstruktor als privat deklariert ist. Dieses Verhalten kann überraschend sein und in bestimmten Szenarien zu unerwünschten Folgen führen.

Das obige ist der detaillierte Inhalt vonWarum kann ich ein Aggregat mit einem privaten Standardkonstruktor initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage