来自Scott Meyers 有效的C ++ :
如果你从不调用模拟非本地静态对象的函数,那么 永远不会产生构建和破坏物体的成本, 对于真正的非本地静态对象而言,这是不可能的。
功能:
FileSystem& tfs()
{
static FileSystem fs;
return fs;
}
但标准说:
具有静态的块范围实体的常量初始化(3.6.2) 存储持续时间(如果适用)在其阻止之前执行 第一次进入。 允许执行早期 使用静态或线程初始化其他块范围变量 在与实施相同的条件下的存储持续时间 允许使用静态或线程静态初始化变量 命名空间范围内的存储持续时间(3.6.2)。
这意味着,即使我们没有调用函数fs
,我们也无法确定tfs()
变量是否已初始化。因为允许实现对具有静态存储持续时间的变量执行早期初始化。
谁是对的或我错过了什么?
答案 0 :(得分:7)
Constant initialization描述了可以在编译时确定的初始化。
只有在C ++ 11及更高版本中才能考虑具有非平凡构造函数的类型:
如果构造函数是
constexpr
在"有效的C ++"中,迈耶斯将你问题中的课程字面描述为:
class FileSystem {...};
这意味着,鉴于C ++标准是正确的,"有效的C ++"只要FileSystem
提供的构造函数不是constexpr
,即使在 C ++ 11之后也可以保持正确。