ローカルで定義された静的変数のコンテキストで、変数の初期化時に例外がスローされ、変数をインスタンス化するために再試行すると、例外後にローカル静的変数の初期化を再試行します。
例えば:
void someFunc()
{
bool initialized=false;
do
{
try
{
static SomeType throwingConstructor; //it throws the first time!
initialized=true;
}
catch(...)
{
//some other code
}
}
while(!initialized);
}
スタックがループ変数が再び初期化さしようと二度目に実行されることが、例外のためunwindedであるので、私は、期待。 それにもかかわらず、ローカル静的変数は一度だけ初期化されるため、何らかの形での未定義の振る舞いがあります。 このコードフラグメントの予想される動作は何ですか?この場合、標準によって定義された動作が保証されていますか?
問題が何ですか?ローカルの静的変数*は一度initializeされますが、一度は "全く"ではありません。例外がある場合、変数は初期化されません。 –
これはまさに私が考えていたものですが、私は標準の落とし穴に落ちないようにしたいと思っていました... –