2016-04-05 16 views
4

ローカルで定義された静的変数のコンテキストで、変数の初期化時に例外がスローされ、変数をインスタンス化するために再試行すると、例外後にローカル静的変数の初期化を再試行します。

例えば:

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

スタックがループ変数が再び初期化さしようと二度目に実行されることが、例外のためunwindedであるので、私は、期待。 それにもかかわらず、ローカル静的変数は一度だけ初期化されるため、何らかの形での未定義の振る舞いがあります。 このコードフラグメントの予想される動作は何ですか?この場合、標準によって定義された動作が保証されていますか?

+0

問題が何ですか?ローカルの静的変数*は一度initializeされますが、一度は "全く"ではありません。例外がある場合、変数は初期化されません。 –

+0

これはまさに私が考えていたものですが、私は標準の落とし穴に落ちないようにしたいと思っていました... –

答えて

7

標準では、この場合に定義された動作が保証されていますか?

はい。このケースは、標準で正確に言及されています。 ...

...静的記憶域期間(3.7.1)またはスレッドストレージ 期間(3.7.2)を持つすべてのブロックスコープ変数

そうでない場合:(私が強調さ)$6.7/4 Declaration statement [stmt.dcl]によると、そのような変数は、制御が最初にその宣言を通過するときに初期化される です。そのような変数は、その初期化の完了時に で初期化されたとみなされます。 例外をスローすることによって初期化が終了した場合、初期化 は完了していないため、次にコントロールが宣言を入力したときに再試行されます。

2

初期化中に例外がスローされた場合、静的変数は初期化されません。

次にコードがその上を流れるときに初期化されます。

これは標準によって保証されています。

関連する問題