[英]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.