【发布时间】:2016-11-26 18:04:52
【问题描述】:
什么时候初始化静态局部变量? 如果在构造函数中抛出异常,该对象是否被认为是构造的?会调用析构函数吗?
考虑闲置代码:
#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();
}
}
输出:acabBA
第一次调用 foo() 时,尝试初始化 b。它的构造函数被调用,它首先构造所有的成员变量。这意味着 A::A() 被调用,打印 a。 A::A() 然后抛出一个异常,构造函数被中止,b 和 B::a 都没有被认为是实际构造的。
为什么第一次没有初始化b?
【问题讨论】:
标签: c++ c++11 exception static-initialization