是否定义了在全局空间中的静态变量之前声明类的对象?

时间:2011-06-29 06:30:26

标签: c++ initialization static-members undefined-behavior

以下是计算对象的简单案例:

struct A
{
  static int count;
  A () { ++ count; }
};

现在,它的对象和static成员被声明为:

A obj;  // comes 1st
int A::count = 5;  // comes 2nd

g++ produces expected result。但是,因为A::count的定义出现在全球空间中的A个实例之一之后,它不应该是未定义的行为吗?

1 个答案:

答案 0 :(得分:2)

取决于。

3.6.2

  

具有静态的对象的存储   存储持续时间(basic.stc.static)   应为零初始化(dcl.init)   在任何其他初始化之前   地点。零初始化和   用常量初始化   表达被统称为   静态初始化;所有其他   初始化是动态的   初始化。 POD类型的对象   (basic.types)具有静态存储   持续时间初始化   表达式(expr.const)应该是   在任何动态之前初始化   初始化发生。

由于您使用常量表达式初始化了POD,因此它将被静态初始化,即在任何构造函数运行之前。更改任何这些条件,可能会发生意外结果。