在本地定义的静态变量的上下文中,如果在变量初始化时抛出异常并且我们重试实例化变量,那么预期的行为是什么?
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);
}
我希望,由于异常导致堆栈未展开,第二次循环执行时变量会再次尝试初始化。 尽管如此,本地静态变量只初始化一次,因此它会以某种方式闻到未定义的行为。 这段代码片段的预期行为是什么?在这种情况下,标准是否保证定义的行为?
答案 0 :(得分:7)
在这种情况下,标准是否保证定义的行为?
是。这个案例在标准中提到了。根据{{1}}(我强调):
...具有静态存储持续时间(3.7.1)或线程存储的所有块范围变量 持续时间(3.7.2)......
否则这样的变量是 初始化第一次控制通过其声明;这样的变量被认为是初始化的 完成初始化。 如果初始化通过抛出异常退出,则初始化 未完成,因此下次控制进入声明时将再次尝试。
答案 1 :(得分:2)
如果在初始化期间抛出异常,则不会初始化静态变量。
下次代码流过它时会初始化。
标准保证了这一点。