我可以安全地将内容存储在非pod静态数据成员构造函数的构造函数中吗?例如:
class Foo
{
public:
static Foo& instance()
{
static Foo inst;
return inst;
}
void store(int x) { numbers.push_back(x); }
private:
Foo() {}
std::vector<int> numbers;
};
class Bar
{
public:
Bar() { Foo::instance().store(5); }
};
class Thing
{
public:
static Bar bar;
};
// in thing.cpp:
Bar Thing::bar;
上述代码是否正确并产生定义的行为?
注意:问题不是关于静态本地,而是关于std::vector
,这取决于在bar构造函数之前可能不会发生的任何静态初始化。
答案 0 :(得分:6)
函数或方法中的静态变量在第一次调用时初始化。因此,上述代码段将按预期工作。
致电订单:
答案 1 :(得分:5)
std::vector
不使用任何静态数据,因此它是安全的。
即使是在std::vector
中使用静态数据的奇怪实现也需要确保它对您的使用安全且不可见(例如,通过使用本地静态而不是全局对象),因此您可以假设它的行为就好像它不使用任何静态数据一样。
插入std::vector
确实使用全局的freestore(又名堆)并使用静态数据,但是从全局构造函数中可以安全地执行,并且不是std::vector
特有的,但适用于任何在main
开始之前由全局构造函数完成的内存分配。