2016-04-05 12 views
4

Was ist im Kontext einer lokal definierten statischen Variablen das erwartete Verhalten, wenn eine Ausnahme bei der Variableninitialisierung ausgelöst wird und wir versuchen, die Variable zu instanziieren?Initialisierung der lokalen statischen Variablen nach Ausnahme wiederholen

Z. B .:

void someFunc() 
{ 
    bool initialized=false; 
    do 
    { 
     try 
     { 
      static SomeType throwingConstructor; //it throws the first time! 
      initialized=true; 
     } 
     catch(...) 
     { 
      //some other code 
     } 
    } 
    while(!initialized); 
} 

Ich würde erwarten, da der Stapel wegen der Ausnahme abgewickelten ist, dass das zweite Mal, wenn die Schleife der Variable ausgeführt wird, versucht es erneut initialisiert werden. Dennoch werden lokale statische Variablen nur einmal initialisiert, also riecht es irgendwie undefiniertes Verhalten. Was ist das erwartete Verhalten dieses Codefragments? Gewährleistet der Standard in diesem Fall ein definiertes Verhalten?

+0

Was ist das Problem? Lokale statische Variablen * werden * einmal initialisiert, aber einmal ist mehr als "überhaupt nicht"; Wenn eine Ausnahme vorliegt, wird die Variable nicht initialisiert. –

+0

Es ist genau das, was ich dachte, aber ich wollte sicher sein, nicht in die Falle des Standards zu fallen ... –

Antwort

7

Gewährleistet der Standard in diesem Fall ein definiertes Verhalten?

Ja. Dieser Fall wird im Standard genau erwähnt. Nach $6.7/4 Declaration statement [stmt.dcl] (von mir hervorgehoben):

... alles Block-scope Variablen mit statischer Speicherdauer (3.7.1) oder Fadenspeicher Dauer (3.7.2) ...

Andernfalls Eine solche Variable ist initialisiert das erste Mal, dass die Steuerung ihre Deklaration durchläuft; Eine solche Variable gilt als initialisiert auf der Abschluss seiner Initialisierung. 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.

2

Wenn während des Initialisierers eine Ausnahme ausgelöst wird, wird die statische Variable nicht initialisiert.

Es wird beim nächsten Durchlauf des Codes initialisiert.

Dies wird durch den Standard garantiert.

Verwandte Themen