3.6.2 Initialisierung nicht lokaler Objekte [basic.start.init]
1
Der Speicher für Objekte mit statischer Speicherdauer ( basic.stc.static ) muss vor jeder anderen Initialisierung auf Null initialisiert werden ( dcl.init ). Objekte von POD-Typen ( basic.types ) mit statischer Speicherdauer, die mit konstanten Ausdrücken ( expr.const ) initialisiert wurden, müssen initialisiert werden, bevor eine dynamische Initialisierung stattfindet. Objekte des Namespace-Bereichs mit statischer Speicherdauer, die in derselben Übersetzungseinheit definiert und dynamisch initialisiert sind, werden in der Reihenfolge initialisiert, in der ihre Definition in der Übersetzungseinheit angezeigt wird. [Hinweis: dcl.init.aggr beschreibt die Reihenfolge, in der aggregierte Mitglieder initialisiert werden. Die Initialisierung lokaler statischer Objekte wird in stmt.dcl beschrieben . ]]
[mehr Text unten, der mehr Freiheiten für Compiler-Autoren hinzufügt]
6.7 Deklarationserklärung [stmt.dcl]
...
4
Die Nullinitialisierung ( dcl.init ) aller lokalen Objekte mit statischer Speicherdauer ( basic.stc.static ) wird durchgeführt, bevor eine andere Initialisierung stattfindet. Ein lokales Objekt vom Typ POD ( basic.types ) mit statischer Speicherdauer, das mit konstanten Ausdrücken initialisiert wurde, wird initialisiert, bevor sein Block zum ersten Mal eingegeben wird. Eine Implementierung kann eine frühe Initialisierung anderer lokaler Objekte mit statischer Speicherdauer unter denselben Bedingungen durchführen, unter denen eine Implementierung ein Objekt mit statischer Speicherdauer im Namespace-Bereich ( basic.start.init) statisch initialisieren darf). Andernfalls wird ein solches Objekt initialisiert, wenn die Steuerung zum ersten Mal ihre Deklaration durchläuft. Ein solches Objekt gilt nach Abschluss seiner Initialisierung als initialisiert. Wenn die Initialisierung durch Auslösen einer Ausnahme beendet wird, ist die Initialisierung nicht abgeschlossen, sodass sie beim nächsten Eingeben der Steuerung in die Deklaration erneut versucht wird. Wenn die Steuerung die Deklaration (rekursiv) erneut eingibt, während das Objekt initialisiert wird, ist das Verhalten undefiniert. [ Beispiel:
int foo(int i)
{
static int s = foo(2*i); // recursive call - undefined
return i+1;
}
- Beispiel beenden ]
5
Der Destruktor für ein lokales Objekt mit statischer Speicherdauer wird genau dann ausgeführt, wenn die Variable erstellt wurde. [Hinweis: basic.start.term beschreibt die Reihenfolge, in der lokale Objekte mit statischer Speicherdauer zerstört werden. ]]