2016-08-09 52 views
3

Wenn ich eine Initialisierungsliste verwenden, um eine Struktur zu erstellen, aber die Initialisierungsliste enthält weniger Elemente als meine Struktur, sehe ich die verbleibenden Elemente mit Nullen initialisiert werden.C++ Initialisiererlisten mit weniger Elementen als die Struktur

Ist dies ein undefiniertes Verhalten und ich sehe Nullen, weil mein Compiler (VS2015) beschlossen hat, den Speicher für mich auf Null zu setzen?

Oder könnte mir jemand auf die Dokumentation verweisen, die dieses Verhalten in C++ erklärt?

Dies ist mein Code:

struct Thing { 
    int value; 
    int* ptr; 
}; 


void main() { 
    Thing thing { 5 }; 
    std::cout << thing.value << " " << thing.ptr << std::endl; 
} 

Und das ist, was er druckt:

5 00000000 

Das letzte Element ist derjenige, der ohne Initialisierer auf Null gesetzt wurde.

+3

Diese '{5}' setzt nur den ersten Wert '5' und den Rest' 0' – DimChtz

+0

@DimChtz Also genau wie ein Array initialisieren? int a [5] = {5} setzt alle meine nicht spezifizierten Elemente auf Null. – MondKin

+0

@DimChtz Wissen Sie, wie dies aufgerufen wird, um es in den Dokumenten zu suchen? – MondKin

Antwort

6

Dies ist ein definiertes Verhalten. Gemäß der Regel aggregate initialization ist das verbleibende Element ptrvalue-initialized, d. H. zero-initialized zu NULL-Zeiger.

(emphasis Mine)

Wenn die Anzahl der Initialisierer Klauseln geringer ist als die Anzahl der Mitglieder and bases (since C++17) oder Initialisiererliste ganz leer ist, werden die restlichen Mitglieder and bases (since C++17)by their default initializers, if provided in the class definition, and otherwise (since C++14) durch leere Listen initialisiert, in Übereinstimmung mit der übliche Listeninitialisierungsregeln (die Wert-Initialisierung für Nicht-Klassen-Typen und Nicht-Aggregat-Klassen mit Standardkonstruktoren und Aggregat-Initialisierung für Aggregate ausführt). Wenn ein Mitglied eines Referenztyps eines dieser verbleibenden Mitglieder ist, ist das Programm schlecht ausgebildet.