根据标准,std :: vector是否受静态初始化顺序问题的影响?

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构造函数之前可能不会发生的任何静态初始化.

Seb*_*ann 6

函数或方法中的静态变量在第一次调用时初始化.因此,上述片段将按预期工作.

来电订单:

  1. 酒吧构造函数
  2. :: foo的实例()
  3. Foo构造函数(静态变量初始化)


Jon*_*ely 5

std::vector 不使用任何静态数据,所以它是安全的.

即使是一个使用静态数据的奇怪实现也std::vector需要确保它对你的数据的使用是安全的和不可见的(例如通过使用局部静态而不是全局对象),所以你可以假设它的行为就好像它没有'使用任何静态数据.

插入到一个std::vector确实使用全局的freestore(又名堆)并使用静态数据,但是从全局构造函数可以安全地执行,并且不是特定的,std::vector但适用于全局构造函数在main启动之前完成的任何内存分配.