在单个翻译单元中考虑以下代码:
class C {
private:
struct Init {
Init() {
/* compute data once here */
}
};
static const Init& i;
static int data[];
public:
/* interface for reading data */
};
const C::Init& C::i = Init();
int C::data[200];
Run Code Online (Sandbox Code Playgroud)
int C::data[200]是零初始化,这意味着它是静态初始化的.静态初始化在动态初始化之前.由于C::Init::Init()不是一个常量表达式,C::i被动态地初始化,一定后 C::data.
详情见3.6.2.
盗版报价:
具有静态存储持续时间的变量应在任何其他初始化发生之前进行零初始化.[...]一起,零初始化和常量初始化称为静态初始化; 所有其他初始化是动态初始化.在进行任何动态初始化之前,应执行静态初始化.