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

时间:2014-03-05 20:26:55

标签: c++ c++11 language-lawyer

我可以安全地将内容存储在非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构造函数之前可能不会发生的任何静态初始化。

2 个答案:

答案 0 :(得分:6)

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

致电订单:

  1. Bar构造函数
  2. 富::实例()
  3. Foo构造函数(静态变量初始化)

答案 1 :(得分:5)

std::vector不使用任何静态数据,因此它是安全的。

即使是在std::vector中使用静态数据的奇怪实现也需要确保它对您的使用安全且不可见(例如,通过使用本地静态而不是全局对象),因此您可以假设它的行为就好像它不使用任何静态数据一样。

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