Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 如果在初始化静态局部变量之前发生异常,会发生什么情况?_C++_C++11_Exception_Static Initialization - Fatal编程技术网

C++ 如果在初始化静态局部变量之前发生异常,会发生什么情况?

C++ 如果在初始化静态局部变量之前发生异常,会发生什么情况?,c++,c++11,exception,static-initialization,C++,C++11,Exception,Static Initialization,静态局部变量何时初始化? 如果在构造函数中抛出异常,是否认为该对象已构造?会调用析构函数吗 以休闲代码为例: #include <iostream> #include <exception> int x = 0; class A { public: A() { std::cout << 'a'; if (x++ == 0) { throw std::exception(); } } ~A() { std::c

静态局部变量何时初始化? 如果在构造函数中抛出异常,是否认为该对象已构造?会调用析构函数吗

以休闲代码为例:

#include <iostream>
#include <exception>

int x = 0;

class A {
public:
  A() {
    std::cout << 'a';
    if (x++ == 0) {
      throw std::exception();
    }
  }
  ~A() { std::cout << 'A'; }
};

class B {
public:
  B() { std::cout << 'b'; }
  ~B() { std::cout << 'B'; }
  A a;
};

void foo() { static B b; }

int main() {
  try {
    foo();
  }
  catch (std::exception &) {
    std::cout << 'c';
    foo();
  }
}
#包括
#包括
int x=0;
甲级{
公众:
(){

std::cout每次控制传递变量定义时,都会尝试初始化具有静态存储持续时间的块作用域变量,直到成功

从[stmt.dcl]/4:

使用静态存储持续时间(3.7.1)或线程存储动态初始化块作用域变量 持续时间(3.7.2)在控制第一次通过其声明时执行;考虑此类变量 初始化完成后初始化。如果初始化通过抛出异常退出,则 初始化未完成,因此下次控件输入声明时将再次尝试初始化。


如果一个类型为
B
的对象的构造引发异常,那么它的构造当然不能完成。

并且按照静态变量的销毁顺序,它不会有任何影响?@Adib:我不明白-对什么有影响?静态变量的销毁顺序与它们的构造顺序相反(当然,这只有在实际发生构造时才相关)。是的,我确实想知道这一点,因为静态变量在异常之前没有构造,所以它不会改变破坏顺序。对吗?@Adib:只有对象被破坏。如果没有对象,就没有什么可破坏的。