Was ist eine "rekursive_init_error" Ausnahme?

8

Ich habe mich entschlossen, einen Test mit berechneten Gotos und lokaler Statik durchzuführen

%Vor%

Ich wollte sehen, ob die Ausgabe "init init!" wäre. Aber zu meiner Überraschung habe ich diese Ausgabe nicht erhalten, sondern GCC hat es elegant gehandhabt und zur Laufzeit ausgegeben:

%Vor%

Was ist diese Ausnahme? Ist es eine Standardausnahme? C ++ 03 oder C ++ 0x? Danke für jede Erklärung.

    
Johannes Schaub - litb 06.08.2011, 13:39
quelle

1 Antwort

16

Es wird durch das verursacht, was in C ++ 03 §6.7 / 4 gesagt wird:

  

... Sonst wird ein solches Objekt initialisiert, wenn die Steuerung das erste Mal ihre Deklaration durchläuft; Ein solches Objekt wird nach Abschluss seiner Initialisierung als initialisiert betrachtet. Wenn die Initialisierung durch Auslösen einer Ausnahme beendet wird, ist die Initialisierung nicht abgeschlossen. Daher wird sie beim nächsten Eingeben der Deklaration erneut versucht. Wenn die Steuerung die Deklaration (rekursiv) erneut eingibt, während das Objekt initialisiert wird, ist das Verhalten nicht definiert. [Beispiel:

%Vor%
  

- Ende Beispiel]

GCC löst in diesem Fall eine Ausnahme aus. Hier ist eine Dokumentation .

C ++ 11 update: Der folgende Wortlaut wurde in C ++ 11, kurz vor dem Text zum rekursiven Fall, hinzugefügt:

  

Wenn die Steuerung die Deklaration gleichzeitig während der Initialisierung der Variablen eingibt, muss die gleichzeitige Ausführung auf den Abschluss der Initialisierung warten. 88

     

88 Die Implementierung darf keinen Deadlock um die Ausführung des Initialisierers herum einführen.

Ändert das Problem hier nicht, macht dieses Konstrukt jedoch threadsicher, wenn keine Rekursion stattfindet.

    
Mat 06.08.2011, 13:51
quelle

Tags und Links