Tam*_*lei 4 c++ language-lawyer c++11
我可以安全地将东西存储在非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;
Run Code Online (Sandbox Code Playgroud)
以上代码是否正确并产生定义的行为?
注意:问题不是关于静态本地,而是std::vector取决于在bar构造函数之前可能不会发生的任何静态初始化.
std::vector 不使用任何静态数据,所以它是安全的.
即使是一个使用静态数据的奇怪实现也std::vector需要确保它对你的数据的使用是安全的和不可见的(例如通过使用局部静态而不是全局对象),所以你可以假设它的行为就好像它没有'使用任何静态数据.
插入到一个std::vector确实使用全局的freestore(又名堆)并使用静态数据,但是从全局构造函数可以安全地执行,并且不是特定的,std::vector但适用于全局构造函数在main启动之前完成的任何内存分配.
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |