用 static_cast 将基类引用转为派生类引用,基类为虚基类,或引用的实际对象并非派生类对象
C++-Undefined-Behavior-32
示例:
struct A {};
struct B: A {};
struct C: virtual B {};
A a;
C c;
A& ra = a;
A& rc = c;
static_cast<B&>(ra); // Undefined behavior
static_cast<C&>(rc); // Undefined behavior
例中 ra 引用的是基类对象,将其转为派生类引用会导致未定义的行为,A 和 B 是 C 的虚基类,需要运行时数据体现虚基类对象和派生类对象的空间关系,static_cast 不考虑与运行时相关的转换逻辑,无法正确转换。
依据
ISO/IEC 14882:2003 5.2.9(5)-undefined
ISO/IEC 14882:2011 5.2.9(2)-undefined