没有多重继承的指针调整
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
可以隐式转换为任何指针类型,但在某些情况下您可能需要显式转换,例如,在处理模板时。
考虑 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
可以隐式转换为任何指针类型,但在某些情况下您可能需要显式转换,例如,在处理模板时。