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 }
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 }
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).
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!