将对象指针转为其基类对象的指针时,基类对象尚未开始构造或已结束析构
C++-Undefined-Behavior-62
示例:
struct A {
....
};
struct B: A {
B();
B(A*);
};
struct C: B {
C(): B(this) { // Undefined behavior
}
};
例中将 C 的 this 指针作为基类 B 构造函数的参数,相当于将 C* 转为 A*,而这时基类 B 和 A 均未开始构造,会导致未定义的行为。
又如(各项声明接上例):
struct X {
X(A*);
};
struct D: B, X {
D(): B(), X(this) { // OK
}
};
将 D 的 this 指针作为基类 X 构造函数的参数,相当于将 D* 转为 A*,这时 B 的构造函数已经执行完毕,所以这种情况没有问题。
依据
ISO/IEC 14882:2003 12.7(2)-undefined
ISO/IEC 14882:2011 12.7(3)-undefined