2013-09-26 13 views
6

Gibt es in C++ irgendwelche Garantien für die Reihenfolge, in der Array-Elemente konstruiert werden?C++ - Array-Elemente Reihenfolge der Konstruktion

#include <iostream> 
using namespace std; 

struct A { 
    A() { cout << this << endl; } 
}; 

int main() 
{ 
    cout << "[0] is " << new A[3]; 
} 

druckt

0x602010 
0x602011 
0x602012 
[0] is 0x602010 

was impliziert, dass die Elemente in der Sequenz konstruiert wurden [0], [1] und [2]. Wird diese Reihenfolge von der Sprache garantiert?

+1

Arrays sind einfach zusammenhängende Stellen im Speicher, wobei jedes Element in der Anordnung von ((Ort des ersten Elements zugegriffen wird aufgerufen des Arrays) + (tiefgestellt * sizeof (was auch immer t es ist))), also würde ich ja sagen – jonhopkins

+0

Ja. Ich würde eine Antwort darauf geben, aber dann müsste ich nach einer Referenz suchen, und ich habe jetzt keine Lust, das zu tun. –

Antwort

11

Ja, das von C++ 11 12.6/3 ([class.init]/3) garantiert wird:

Wenn ein Array von Klassenobjekten initialisiert (entweder explizit oder implizit) und die Elemente initialisiert durch Konstruktor wird der Konstruktor für jedes Element des Arrays, nach der Subskript Reihenfolge

+0

Diese Klausel ist sehr wichtig für die * Zerstörung * im Falle einer Ausnahme während einer der Konstruktionen. –

+0

Und vor allem sind sie in umgekehrter Reihenfolge zerstört. Dies gilt auch, wenn während des Baus eine Ausnahme ausgelöst wird. Beispiel: arr [0] wird konstruiert, arr [1] wird konstruiert, arr [2] wirft während der Konstruktion, arr [1] wird zerstört, arr [0] wird zerstört. –

Verwandte Themen