我有这个层次结构:
struct Params { int k = 17; };
struct A
{
A(Params& par): _p(par)
{ }
Params& _p;
};
struct B: public A
{
using A::A;
int c{this->_p.k};
};
int main()
{
Params p;
B b(p);
return 0;
}
我可以放心,在B::c
声明中调用A::_p
之前,将始终对其进行初始化吗?
谢谢!
是的,它将被初始化。
在开始构造派生类之前,必须完全构造基类。因此,只要A
初始化的构造函数A::_p
,派生类将始终*看到它完全初始化。
[*] 当然,只要付出足够的努力,你总是可以打破东西;例如:http://coliru.stacked-crooked.com/a/196a5b0217efbbb1在那里,我使用逗号运算符在构造任何内容之前调用B::foo()
;幸运的是,编译器将其检测为警告。