我认为Function Scoped Non-Pod结构是初始化的 第一次调用该函数。但是在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到成功构造为止。
此行为实现是特定的还是标准保证的?
以下是用于演示行为的人为举例:
#include <iostream>
#include <string>
using namespace std;
//dummy resource class
class Resource {
public:
Resource() {
cerr<<"Allocate Resource "<<endl;
}
~Resource() {
cerr<<"Free Resource"<<endl;
}
};
//dummy class which will be statically instantiated
class Dummy {
public:
Dummy() {
cerr<<"in Dummy"<<endl;
throw(string("error"));
}
Resource res;
};
//main program
int main() {
for(int i = 0;i<3;i++) {
try {
//create a static object throw and exception
static Dummy foo;
}
catch ( std::string &e) {
cerr<<"Caught exception:"<<e<<endl<<endl;
}
}
return 1;
}
输出
迭代:0
分配资源
静态对象构造函数
免费资源
捕获异常:错误
迭代:1
分配资源
静态对象构造函数
免费资源
捕获异常:错误
迭代:2
分配资源
静态对象构造函数
免费资源
捕获异常:错误**
答案 0 :(得分:4)
我的印象是,在第一次调用函数时,Function Scoped Non-Pod结构是初始化的。
当然,但想想'初始化'意味着什么 - 如果构造函数抛出,则对象未初始化,因为没有对象。因此,下次遇到对象声明时,它将(尝试)再次初始化。