Set*_*gie 5 c++ static initialization exception
我有一个功能,可以减少到这个:
void f() {
    static MyObject o("hello");
    DoSomethingWith(o);
}
这个函数是在一个C API边界上调用的,所以就像一个好孩子一样,我用它try来捕获任何在越过边界之前抛出的异常并搞砸了:
void f() {
    try {
        static MyObject o("hello");
        DoSomethingWith(o);
    } catch (const MyObjectException& e) {
        Message("Constructor of o failed");
    }
}
第一次调用此函数,我收到消息"Constructor of o failed".但是,稍后,再次调用该函数,我再次收到该消息.我收到的消息多次f被称为.我正在使用Visual C++,所以这告诉我MSVC++的功能,但不是应该做什么.
我的问题是,当的构造会发生什么static功能的可调异常终止(由throw荷兰国际集团,一longjmp出构造的,终止线程,它是在等)?static在它之前和之后声明的任何其他变量应该发生什么?我也很感谢标准中的任何相关引用.
[stmt.dcl]C++ 11标准的第6.7节()规定了这一点
具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的所有块范围变量的零初始化(8.5)在任何其他初始化发生之前执行.具有静态存储持续时间的块范围实体的常量初始化(3.6.2)(如果适用)在首次输入块之前执行.允许实现在静态或线程存储持续时间内执行其他块范围变量的早期初始化,条件是允许实现在命名空间范围内静态初始化具有静态或线程存储持续时间的变量(3.6.2).否则,在第一次控制通过其声明时初始化这样的变量; 这样的变量在初始化完成后被认为是初始化的.如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化. 如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.如果控件在初始化变量时以递归方式重新输入声明,则行为未定义.
| 归档时间: | 
 | 
| 查看次数: | 1397 次 | 
| 最近记录: |