局部变量的静态初始化

时间:2015-06-25 04:57:48

标签: c++ initialization

来自Scott Meyers 有效的C ++

  

如果你从不调用模拟非本地静态对象的函数,那么   永远不会产生构建和破坏物体的成本,   对于真正的非本地静态对象而言,这是不可能的。

功能:

FileSystem& tfs()
{ 
    static FileSystem fs;
    return fs; 
}

但标准说:

  

具有静态的块范围实体的常量初始化(3.6.2)   存储持续时间(如果适用)在其阻止之前执行   第一次进入。 允许执行早期   使用静态或线程初始化其他块范围变量   在与实施相同的条件下的存储持续时间   允许使用静态或线程静态初始化变量   命名空间范围内的存储持续时间(3.6.2)。

这意味着,即使我们没有调用函数fs,我们也无法确定tfs()变量是否已初始化。因为允许实现对具有静态存储持续时间的变量执行早期初始化。

谁是对的或我错过了什么?

1 个答案:

答案 0 :(得分:7)

Constant initialization描述了可以在编译时确定的初始化。

只有在C ++ 11及更高版本中才能考虑具有非平凡构造函数的类型:

  

如果构造函数是constexpr

在"有效的C ++"中,迈耶斯将你问题中的课程字面描述为:

  

class FileSystem {...};

这意味着,鉴于C ++标准是正确的,"有效的C ++"只要FileSystem提供的构造函数不是constexpr即使在 C ++ 11之后也可以保持正确