【发布时间】:2019-05-21 09:34:44
【问题描述】:
所以我正在阅读 Zero Initialization 将初始化:
在任何其他初始化之前,每个具有静态或线程本地存储持续时间的命名变量不受常量初始化的影响
我使用 Singleton 和传统的私有构造函数和一个静态公共方法,其中有一个本地静态单例对象,该方法将返回。
我的问题是该类还有一个静态的vector,它是零初始化的,它似乎在单例之后被初始化,这意味着我无法与之交互。有什么东西可以控制这个初始化顺序,还是简单地定义了实现?
这是我的代码的简化:
class Foo {
Foo(){ s_vec.push_back(13); }
public:
static Foo& Get() {
static Foo singleton;
return singleton;
}
int Front() const { return s_vec.front(); }
static vector<int> s_vec;
};
vector<int> Foo::s_vec;
我遇到了这个问题,因为在代码的其他地方我正在初始化一个像这样的静态全局变量并且没有得到 13:static const auto element = Foo.Get().Front()
【问题讨论】:
-
如果意图只有一个实例,是否需要将向量设为静态?
-
注意:“错误:不能调用没有对象的成员函数‘Foo& Foo::Get()’。”我认为你的意思是这个函数是静态的。
-
您如何确定“它似乎在单例之后被初始化”?我的简单测试表明 Foo::s_vec 在 Foo::Get() 被调用之前存在。
-
"Foo& Get()" 应该是 "static Foo& Get()",我假设?
标签: c++ static singleton static-variables zero-initialization