关于Scot Meyers的"Effective C++"和第4项:非本地静态对象在使用之前可以是未初始化的(静态在这种情况下意味着"全局",具有静态生命).如果将其替换static为在返回对它的引用的函数内创建的local- 对象,则在使用之前确定该对象已初始化.
我总是有一个常量文件.我extern const int a;在.hpp文件中声明并在.cpp文件中定义它.但那么同样的事情会发生吗?a可以是未初始化的.或不?同样的规则是否适用于内置类型?
即使可以,返回对“局部静态”变量的引用也不是一个好主意。该变量(大概)是在本地声明的,以将其范围缩小到仅包含函数,因此尝试以这种方式增加其范围是相当棘手的。您可以将其设为全局变量,并使用std::call_once之类的东西来保证它在第一次使用时恰好初始化一次。返回对本地静态对象的可变引用也会引发线程安全问题,因为该函数可能不再是可重入的。
具有静态存储持续时间的 POD 类型保证为零初始化。您还可以使用常量表达式初始化它们,并且语言将保证它们在任何动态初始化发生之前被初始化。这是一个类似的问题,可能会提供一些额外的见解。