指针调整没有多重继承

时间:2016-12-15 18:45:56

标签: c++ multiple-inheritance static-cast nullptr

考虑一个班级布局:

| 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,也没有答案。

1 个答案:

答案 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可以隐式转换为任何指针类型,但在某些情况下您可能需要显式转换,例如,在处理模板时。