C++多访问说明符和初始化顺序



我们知道在下面的代码中

class Foo1 {
private:
int i;
bool b;
public:
Foo1() : i(7), b(false) {} 
};

"i〃;将在"之前初始化;b";。如果我尝试初始化";b";在";i〃;,我会得到警告的。

这个案子怎么样:

class Foo2 {
private:
int i;
private:
bool b;
public:
// what happens if b is first because compiler reordered?
Foo2() : b(false),  i(7) {} 
};

我们知道编译器可以自由地订购";i〃;以及";b";因为它们在单独的访问说明符中。

那么,在这种情况下,初始化的顺序是什么呢?

有没有像前面的简单案例一样的保证?

保证初始化的顺序;CCD_ 1总是在CCD_ 2之前初始化。非静态数据成员按照其在类定义中的声明顺序进行初始化,而不考虑其访问说明符。

[class.base.init]/13.3

然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样,与mem初始化器的顺序无关(。

最新更新