繁体   English   中英

静态初始化局部变量

[英]Static initialization of local variables

来自Scott Meyers Effective C ++

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

功能:

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

但标准说:

具有静态存储持续时间的块范围实体的常量初始化(3.6.2)(如果适用)在首次输入块之前执行。 允许实现 在静态或线程 存储持续时间 执行 其他块范围变量的 早期 初始化, 条件是 允许 实现 在命名空间范围内 静态初始化具有静态或线程 存储持续时间 的变量 (3.6.2)。

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

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

常量初始化描述了可在编译时确定的初始化。

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

如果构造函数是constexpr

在“Effective C ++”中,Meyers将您问题中的课程字面描述为:

class FileSystem {...};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM