没有多重继承的指针调整

pointer adjustment with no multiple inheritance

考虑 class 布局:

| A | B | ( class B is derived from A )
0x0 0x8

当然,向下转型或向上转型没有什么可调整的。 但是在标准中是否为这种情况定义了编译器的行为?

如果不是,那么,一般来说,在没有多重继承的情况下,static_casting 的 nullptr 安全吗?


A * volatile a_ptr = nullptr ; // or change with B * and cast to A * 
assert( ! static_cast< B * >( a_ptr ) ) ; // is that guaranteed by Standard.? 

编译器总是(在所有实现中)不执行调整吗?

更一般地(对于多重继承的情况),编译器可以在 static_cast.?

内调整 nullptr

相关 question,也未回答。

nullptr

static_cast 总是安全的。无论您的 class 布局是什么,您始终可以在 class 层次结构中 static_cast nullptr 并将定义结果 - nullptr 转换类型。

保证从 nullptr 转换为 nullptr 的任何类型都可以在标准 5.2.9 中找到:

A prvalue of type “pointer to cv1 B,” where B is a class type, can be converted to a prvalue of type “pointerto cv2 D,” where D is a class derived (Clause 10) from B, if a valid standard conversion from “pointer to D” to “pointer to B” exists (4.10), cv2 is the same cv-qualification as, or greater cv-qualification than, cv1, and B is neither a virtual base class of D nor a base class of a virtual base class of D. The null pointer value (4.10) is converted to the null pointer value of the destination type.

虽然 nullptr 可以隐式转换为任何指针类型,但在某些情况下您可能需要显式转换,例如,在处理模板时。