Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数作用域静态非Pod对象初始化_C++_Static - Fatal编程技术网

C++ 函数作用域静态非Pod对象初始化

C++ 函数作用域静态非Pod对象初始化,c++,static,C++,Static,我的印象是功能范围的非吊舱结构是初始化的 第一次调用函数时。但是,在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到成功构建为止 这种行为是特定于实现的还是标准保证的 下面是一个人为的例子来演示该行为: #include <iostream> #include <string> using namespace std; //dummy resource class class Resource { public: Resource() {

我的印象是功能范围的非吊舱结构是初始化的 第一次调用函数时。但是,在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;
}
#包括
#包括
使用名称空间std;
//虚拟资源类
类资源{
公众:
资源(){
瑟尔
我的印象是,函数作用域的非Pod结构在第一次调用函数时被初始化

当然可以,但是想想“initialized”是什么意思——如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它将(尝试)再次初始化

我的印象是,函数作用域的非Pod结构在第一次调用函数时被初始化


当然可以,但是想想“initialized”是什么意思——如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它会(尝试)再次被初始化。

谢谢有意义,所以我猜这个行为不是编译器特有的。@凯蒂:正确,这个行为是由C++标准授权的。谢谢。这是有意义的,所以我猜这个行为不是编译器特有的吗?@凯蒂:正确,这个行为是由C++标准强制执行的。