【问题标题】:Is static constructor order correct with composition静态构造函数顺序是否与组合正确
【发布时间】:2015-11-21 22:25:03
【问题描述】:

我非常了解一般的静态构造函数顺序问题,但是我很想知道这是否也适用于组合。

假设我有以下内容:

#include <vector>
using std::vector;

class Foo
{
    static vector<int> myVector;
    Foo(int i) { myVector.push_back(i); }
    ~Foo() {}
};

vector<int> Foo::myVector;
Foo foo_1(1);
Foo foo_2(2);

我是否可以保证 myVector 的 ctor 会在调用 Foo 的 ctor 之前被调用?

不用说,对此进行测试并发现它确实按预期工作并不能证明任何事情。

【问题讨论】:

  • 在同一个 TU 中,静态初始化实际上通常是有序的(模板实例化是一个例外)。问题是当你有不同的 TU 时。
  • 订单在内部翻译单元中明确定义
  • @vsoftco 请引用这个重复的问题,因为我进行了广泛的搜索,找不到任何专门解决这个特定问题的内容,特别是组合是否有任何影响。谢谢。
  • @dgnuff 在进行任何其他初始化之前,具有静态存储持续时间 (basic.stc.static) 的对象的存储应进行零初始化 (dcl.init)。这是已接受答案中的第一句话。我认为它隐含地暗示 ctor 稍后使用。组合与它无关,遵循通常的规则,即成员在 包含它们的对象之前构造。
  • @vsoftco 更相关的是:“另一个保证的事情是,在使用来自该翻译单元的任何对象或函数之前,将完成来自翻译单元的静态对象的初始化:”这意味着myVector 必须在在任何 TU 中使用之前进行初始化。

标签: c++ constructor static composition


【解决方案1】:

不同编译单元的顺序未定义。 在同一个编译单元中,顺序是很好定义的:与定义相同的顺序。

因此,您的向量将在 foo_1 和 foo_2 之前初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多