在全局空间中,在类的静态变量之前声明该类的对象是否定义良好

Is it well defined to declare an object of the class before its static variable in global space?

本文关键字:对象 是否 定义 声明 变量 空间 全局 静态      更新时间:2023-10-16

下面是计数对象的一个简单例子:

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

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

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

g++产生预期的结果。但既然A::count的定义是在全局空间中的一个A实例之后的,它不应该是未定义的行为吗?

这取决于情况。

3.6.2

具有静态的对象的存储存储持续时间(basic.stc.static)应初始化为零(dcl.init)在进行任何其他初始化之前位置零初始化和用常量初始化表达式统称为静态初始化;所有其他初始化是动态的初始化。POD类型的对象具有静态存储的(基本类型)用常量初始化的持续时间表达式(表达式常量)应为在任何动态之前初始化进行初始化。

由于POD是用常量表达式初始化的,因此它将被静态初始化,即在任何构造函数运行之前。改变这些条件中的任何一个,都可能出现意想不到的结果。