【发布时间】: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