来自Scott Meyers的 Effective C++:
如果您从不调用模拟非本地静态对象的函数,则永远不会发生构造和析构对象的成本,这对于真正的非本地静态对象是不可说的。
该函数:
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
但是标准规定:
如果适用,则会在首次进入其块之前执行具有静态存储期的块作用域实体的常量初始化(3.6.2)。 实现可以在与实现允许在命名空间范围内静态初始化具有静态或线程存储期变量的条件相同的情况下,提前初始化具有静态或线程存储期的其他块作用域变量。
这意味着,即使我们不调用函数 tfs()
,我们也不能确定变量 fs
是否已经初始化。因为实现可以在具有静态存储期的变量上执行早期初始化。
谁是对的,或者我错了什么?