Nullinitialisierung von C ++ - Arrays: Ist dies ein Fehler oder ist dies korrekt?

Hinweis: Wir sprechen hier von (angeblich) C ++ 98-kompatiblen Compilern. Dies ist keine C ++ 11-Frage.

Wir haben ein seltsames Verhalten in einem unserer Compiler und sind uns nicht sicher, ob dies in Ordnung ist oder ob dies ein Compilerfehler ist:

// This struct has a default constructor
struct AAA
{
   AAA() : value(0) {}
   int value ;
} ;

// This struct has a member of type AAA and an array of int, both surrounded
// by ints
struct BBB
{
   int m_a ;
   AAA m_b ;
   int m_c ;
   int m_d[42] ;
} ;

Wenn BBB als solches initialisiert wird:

BBB bbb = {0} ;

Wir haben erwartet, dass alle POD-Mitglieder von BBB (einschließlich m_d, dem Array von ints) mit Null initialisiert werden und alle Nicht-POD-Mitglieder von BBB erstellt werden.

Dies funktionierte auf dem nativen Compiler von AIX, unter Linux / GCC-3.4, unter Windows / VisualC ++ ... Aber nicht auf Solaris / SunStudio, wo nur die Nicht-Arrays-Mitglieder auf Null gesetzt werden.

Wir haben im C ++ 98-Standard (einem Dokumententwurf) ein wenig recherchiert und dabei Folgendes herausgefunden:

[12.6.1 - 2]

Wenn ein Aggregat (ob Klasse oder Array) Elemente des Klassentyps enthält und von einer in geschweiften Klammern eingeschlossenen Initialisierungsliste (8.5.1) initialisiert wird, wird jedes dieser Elemente durch den entsprechenden Zuweisungsausdruck kopierinitialisiert (siehe 8.5).Befinden sich weniger Initialisierer in der Initialisiererliste als Mitglieder des Aggregats, muss jedes nicht explizit initialisierte Mitglied standardmäßig initialisiert werden (8.5)..

Dann:

[8.5 - 5]

Null initialisieren Lagerung für ein Objekt vom Typ T bedeutet:
— Wenn T ein Skalartyp (3.9) ist, wird der Speicher auf den Wert 0 (Null) gesetzt, der in T umgewandelt wird.
- Wenn T ein nicht gewerkschaftlicher Klassentyp ist, wird der Speicher für jedes nicht statische Datenelement und jedes Basisklassen-Unterobjekt mit Null initialisiert.
- wenn T ein Vereinigungstyp ist, wird der Speicher für sein erstes Datenelement 89) auf Null initialisiert;
- Wenn T ein Array-Typ ist, wird der Speicher für jedes Element mit Null initialisiert.
- Wenn T ein Referenztyp ist, wird keine Initialisierung durchgeführt.

Und dann:

Standardmäßig initialisieren Ein Objekt vom Typ T bedeutet:
- Wenn T ein Nicht-POD-Klassentyp ist (Klausel 9), wird der Standardkonstruktor für T aufgerufen (und die Initialisierung ist falsch, wenn T keinen zugänglichen Standardkonstruktor hat).
— Wenn T ein Array-Typ ist, wird jedes Element standardmäßig initialisiert.
— Andernfalls wird der Speicher für das Objekt auf Null gesetzt.

So lese ich es: SunStudio sollte das Array von ints auf Null setzen (BBB :: m_d)

Seltsame Sache: Wenn wir den Standardkonstruktor von AAA entfernen, wird alles in BBB mit Null initialisiert.

FRAGE: Ist das Verhalten von SunStudio Standard, wenn ein Array von Ints einer Struktur, die einen Nicht-POD enthält, nicht auf Null initialisiert werden kann? Oder ist das ein Compiler-Bug?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage