静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
Is static variable guaranteed to be initialized when used by static methods in the same translation unit?
我读到,如果静态全局变量在同一个翻译单元中,则静态全局变量的动态初始化保证按定义顺序进行。然后我想知道当静态全局变量由同一翻译单元中定义的静态方法使用时,是否可以保证静态全局变量必须进行动态初始化。
//Foo.h
class Foo
{
public:
Foo(int i) {m_i = i;}
int m_i;
};
//X.h
class X
{
static void doSth();
static Foo foo;
};
//X.cpp
Foo X::foo(2);
void X::doSth()
{
//Is it guaranteed that foo has been properly initialized here?
std::cout << foo.m_i << std::endl;
}
简短回答:不,全局初始化与静态方法无关。
下面是一个简单的场景来说明原因:如果Foo
的构造函数调用了doSth()
怎么办?
如果需要该保证,则需要使用函数范围的静态变量。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 对象初始化中是否允许指向此成员的指针?
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 是否可以防止省略聚合初始化成员?
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 为什么需要检查 GLAD 或 GLEW 是否正确初始化?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 是否可以使用右值初始化数据成员?
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- C++,检查当我无法使用 NULL/0 时是否初始化了变量
- make_unique值是否初始化字符数组
- new[] 是否初始化内置数组
- 此零是否初始化数据项
- 检查变量是否初始化
- 是否初始化基元-c++
- std::map 中基元类型的值是否初始化
- Windows 的线程本地存储是否初始化值?
- 不管是否初始化,使用sizeof(p[0])真的无害吗?