Heim >Backend-Entwicklung >C++ >Wann werden geschweifte Klammern bei der C-Aggregatinitialisierung mit Arrays verwendet?
Mehrdeutige Initialisierungssyntax für Aggregate, die Arrays enthalten
In C kann das Weglassen von geschweiften Klammern beim Initialisieren von Aggregaten, die Arrays enthalten, zu Verwirrung und Fehlern führen. Dies wird in den folgenden Beispielen deutlich:
// Error: Too many initializers std::array<A, 2> a1 = { {0, 0.1}, {2, 3.4} }; // Valid std::array<double, 2> a2 = {0.1, 2.3};
Klammern erforderlich für std::array von Strukturen
Das erste Beispiel gibt einen Fehler aus, weil std::array ist ein Aggregat und es fehlt ein benutzerdefinierter Konstruktor. Die Initialisierung seines internen Arrays erfordert explizite geschweifte Klammern, wie in der korrigierten Version zu sehen ist:
std::array<A, 2> a1 = { {{0, 0.1}, {2, 3.4}} };
Klammernklammern nicht erforderlich für std::array von PODs
Im Gegensatz dazu std::array
Konsistenz für Aggregate
Der Grundsatz, dass Klammern für Aggregatmitglieder erforderlich sind, gilt auch für andere Aggregattypen wie z na ja:
// Valid B meow1 = {1, 2}; B bark1 = {{1, 2}}; C meow2 = {1, 2}; C bark2 = {{1, 2}};
Mehrdeutigkeit in D
Das folgende Beispiel führt jedoch zu einem Fehler:
// Error: Too many initializers D meow3 = {{1, 2}, {3, 4}}; D bark3 = {{{1, 2}, {3, 4}}};
In D der Initialisierer denn foo ist selbst ein Array. Die geschweiften Klammern in meow3 sind mehrdeutig, da sie sich entweder auf die Initialisierung von foo oder auf sein internes Array beziehen könnten. Um die Mehrdeutigkeit aufzulösen, sind explizite geschweifte Klammern erforderlich, wie in bark3.
Mechanismus zur Initialisierung von Aggregaten
Wenn geschweifte Klammern bei der Aggregatinitialisierung weggelassen werden, gelten mehrere Regeln:
Zusätzliche Beispiele
Das obige ist der detaillierte Inhalt vonWann werden geschweifte Klammern bei der C-Aggregatinitialisierung mit Arrays verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!