引用初始化列表中的非静态成员

在构造函数开始执行之前引用初始化程序列表中的非静态成员可能导致未定义的行为。这是因为并非所有成员都是在此时构建的。从标准草案:

§12.7.1:对于具有非平凡构造函数的对象,在构造函数开始执行之前引用对象的任何非静态成员或基类会导致未定义的行为。

struct W { int j; };
struct X : public virtual W { };
struct Y {
   int *p;
   X x;
   Y() : p(&x.j) { // undefined, x is not yet constructed
   }
};