C++ 函数作用域静态非Pod对象初始化
我的印象是功能范围的非吊舱结构是初始化的 第一次调用函数时。但是,在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到成功构建为止 这种行为是特定于实现的还是标准保证的 下面是一个人为的例子来演示该行为:C++ 函数作用域静态非Pod对象初始化,c++,static,C++,Static,我的印象是功能范围的非吊舱结构是初始化的 第一次调用函数时。但是,在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到成功构建为止 这种行为是特定于实现的还是标准保证的 下面是一个人为的例子来演示该行为: #include <iostream> #include <string> using namespace std; //dummy resource class class Resource { public: Resource() {
#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;
}
#包括
#包括
使用名称空间std;
//虚拟资源类
类资源{
公众:
资源(){
瑟尔
我的印象是,函数作用域的非Pod结构在第一次调用函数时被初始化
当然可以,但是想想“initialized”是什么意思——如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它将(尝试)再次初始化
我的印象是,函数作用域的非Pod结构在第一次调用函数时被初始化
当然可以,但是想想“initialized”是什么意思——如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它会(尝试)再次被初始化。谢谢有意义,所以我猜这个行为不是编译器特有的。@凯蒂:正确,这个行为是由C++标准授权的。谢谢。这是有意义的,所以我猜这个行为不是编译器特有的吗?@凯蒂:正确,这个行为是由C++标准强制执行的。