成员初始化应遵循声明的顺序
8.14 ID_disorderedInitialization
类成员的初始化顺序是按声明的顺序进行的,初始化前面的成员时不可使用后面成员的值。
示例:
struct A {
int* p;
size_t n;
A(size_t s): n(s), p(new int[n]) // Non-compliant
{}
};
虽然在初始化列表中 n 在 p 的前面,但 p 先于 n 声明,n 仍然在 p 之后被初始化,“p(new int[n])”会造成严重错误。
应改为:
struct A {
size_t n;
int* p;
A(size_t s): n(s), p(new int[n]) // Compliant
{}
};
调整了 n 和 p 的声明顺序,使 n 先于 p 初始化即可。
如果使用后面成员的地址初始化前面的成员,则不受本规则约束,如:
struct B {
int*& a;
int* b;
int c[3];
B():
a(b), // OK
b(c) // OK
{}
};
例中 a 为引用,b 的地址在初始化之前就确定了,所以“a(b)”没问题;c 为数组,也是一个地址,所以“b(c)”没有问题。
依据
ISO/IEC 14882:2003 12.6.2(5)
ISO/IEC 14882:2011 12.6.2(10)