异常后重试本地静态变量初始化

时间:2016-04-05 08:45:39

标签: c++ language-lawyer

在本地定义的静态变量的上下文中,如果在变量初始化时抛出异常并且我们重试实例化变量,那么预期的行为是什么?

E.g:

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

我希望,由于异常导致堆栈未展开,第二次循环执行时变量会再次尝试初始化。 尽管如此,本地静态变量只初始化一次,因此它会以某种方式闻到未定义的行为。 这段代码片段的预期行为是什么?在这种情况下,标准是否保证定义的行为?

2 个答案:

答案 0 :(得分:7)

  

在这种情况下,标准是否保证定义的行为?

是。这个案例在标准中提到了。根据{{​​1}}(我强调):

  

...具有静态存储持续时间(3.7.1)或线程存储的所有块范围变量   持续时间(3.7.2)......

     

否则这样的变量是   初始化第一次控制通过其声明;这样的变量被认为是初始化的   完成初始化。 如果初始化通过抛出异常退出,则初始化   未完成,因此下次控制进入声明时将再次尝试。

答案 1 :(得分:2)

如果在初始化期间抛出异常,则不会初始化静态变量。

下次代码流过它时会初始化。

标准保证了这一点。