将以何种顺序召集ctors?
template<class T>
class A {
public:
static std::function<void(void)> funcobj;
};
template<class T>
std::function<void(void)> A<T>::funcobj = [](){};
class B : public A<B> {
public:
static const int i;
B::B()
{
DoSomethingHere();
};
}inst;
std::function<void(void)> B::funcobj = [](){};
const int B::i = 2;
我是对的,订单会是这样的吗?
- const int B :: i - &gt;应该在PE文件的数据部分硬编码,因此根本不需要构建?
- 用于初始化A&lt; std :: function的ctor。 B&gt; :: funcobj
- A的人
- 用于初始化B :: funcobj的std :: function的ctor(虽然A&lt; B&gt; :: funcobj和B :: funcobj在技术上应该相同)
- ctor B :: B
答案 0 :(得分:1)
首先,静态声明将按顺序执行。所以:
template<class T> std::function<void(void)> A<T>::funcobj = [](){};
std::function<void(void)> B::funcobj = [](){};
const int B::i = 2;
(如果 B :: i 是一个对象类型而不是 int 那么它的构造函数就会被调用)
然后,当初始化变量 inst 时,它将通过初始化父类开始,即模板类A 的构造函数将被调用。
最后将调用 B类的构造函数。