函数范围静态对象的构造函数引发异常

Function-scope static object's constructor throws an exception

本文关键字:异常 构造函数 范围 静态 对象 函数      更新时间:2023-10-16

考虑以下代码:

#include <iostream>
struct X{
   X(){
      throw 0;
   }
};
void f(){
   static X x;
}
int main(){
   try {
      f();
   }
   catch(int)   {
      std::cout << "Caught first time" << std::endl;
   }
   try {
      f();
   }
   catch(int) {
      std::cout << "Caught second time" << std::endl;
   }
}

这个程序的输出是

第一次被抓
第二次被抓

那么,标准是否保证静态对象的构造函数将被一遍又一遍地调用,直到它成功完成?我在标准中找不到提到它的地方,所以非常欢迎引用或参考章节。

或者在我的例子中有任何未定义的行为?

只要构造失败,就保证继续尝试。

它是由c++ 03§6.7/4:

所引起的。

…否则,这样的对象将在控件第一次通过其声明时初始化;这样的对象在初始化完成时被认为是初始化的。如果通过抛出异常退出初始化,则初始化未完成,因此下次控件进入声明时将再次尝试初始化。如果控件在对象初始化时(递归地)重新进入声明,则行为未定义。(例子:

int foo(int i)
{
  static int s = foo(2*i);    // recursive call – undefined
  return i+1;
}

——结束例子)

我要注意的是,gcc在尝试递归初始化时会抛出异常,关于我的源代码,请参阅litb的相关问题。