以下是计算对象的简单案例:
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
个实例之一之后,它不应该是未定义的行为吗?
答案 0 :(得分:2)
取决于。
3.6.2
具有静态的对象的存储 存储持续时间(basic.stc.static) 应为零初始化(dcl.init) 在任何其他初始化之前 地点。零初始化和 用常量初始化 表达被统称为 静态初始化;所有其他 初始化是动态的 初始化。 POD类型的对象 (basic.types)具有静态存储 持续时间初始化 表达式(expr.const)应该是 在任何动态之前初始化 初始化发生。
由于您使用常量表达式初始化了POD,因此它将被静态初始化,即在任何构造函数运行之前。更改任何这些条件,可能会发生意外结果。