对于具有静态存储持续时间的对象(basic.stc.static) ,在进行任何其他初始化之前,存储应为零初始化(dcl.init)。零初始化和使用常量表达式的初始化统称为静态初始化; 所有其他初始化都是动态初始化。使用常量表达式(expr.const)初始化具有静态存储时间的 POD 类型(basic.type)的对象应该在进行任何动态初始化之前进行初始化。在同一翻译单元的命名空间范围内定义了静态存储持续时间并动态初始化的对象应该按照它们的定义在翻译单元中出现的顺序进行初始化。
另一个保证是,在使用翻译单元中的任何对象或函数之前,将先从翻译单元初始化静态对象:
命名空间范围对象的动态初始化(dcl.init、 class.static、 class.ctor、 class.exp.init)是否在 main 的第一个语句之前完成,这是实现定义的。如果初始化被推迟到 main 的第一个语句之后的某个时间点,那么它应该发生在第一次使用与要初始化的对象在同一个转换单元中定义的任何函数或对象之前。
class A;
static auto_ptr<A> a(auto_ptr<A>(&GetStaticA()));
A &GetStaticA(void)
{
static A *a = NULL; //the static basic type variables initialized with constant experession will be initialized earlier than the other static ones
if (a == NULL)
{
a = new A();
return *a;
}
}