函数范围静态对象的构造函数引发异常
Function-scope static object's constructor throws an exception
考虑以下代码:
#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的相关问题。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- C++:如何捕获构造函数引发的异常?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 为什么要抛出引用调用复制构造函数的异常?
- std::vector 默认构造函数可以抛出异常吗?
- 如何防止构造函数在引发异常时创建对象
- 当构造函数的参数类型错误时引发异常
- 异常构造函数中的例外
- C++11 引入了采用 'const char*' 的异常构造函数.但是为什么
- 在异常构造函数中参数化错误消息是一种好的做法吗
- 异常构造函数来填充字符串流