考虑一个班级布局:
| A | B | ( class B is derived from A )
0x0 0x8
当然,没有什么可以调整向下转换或向上转换。 但是在Standard中为此案例定义了编译器的行为。?
如果没有,那么,一般来说,当没有多重继承时,nullptr是否为safeptr safe。?
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,也没有答案。
答案 0 :(得分:4)
static_cast
的{{1}}始终是安全的。无论您的类布局是什么,您都可以在类层次结构中始终nullptr
nullptr,并且将定义结果 - 演员类型的static_cast
。
保证nullptr
中的任何类型广告都会产生nullptr
,这可以在标准5.2.9中找到:
类型为“指向cv1 B的指针”的prvalue,其中B是类类型,可以是 转换为“pointerto cv2 D”类型的prvalue,其中D是一个类 如果是有效的标准转换,则从B派生(第10条) “指向D的指针”到“指向B的指针”存在(4.10),cv2是相同的 cv-qualification为,或者比cv1更高的cv资格,而B是 既不是D的虚基类,也不是虚基的基类 D.的类空指针值(4.10)被转换为null 目的地类型的指针值。
虽然nullptr
可以隐式转换为任何指针类型,但在某些情况下您可能需要显式转换,例如,在处理模板时。