C++ 无多重继承的指针调整
考虑一个类布局:C++ 无多重继承的指针调整,c++,multiple-inheritance,static-cast,nullptr,C++,Multiple Inheritance,Static Cast,Nullptr,考虑一个类布局: | A | B | ( class B is derived from A ) 0x0 0x8 当然,向下或向上投射时没有什么可调整的。 但标准中是否定义了针对这种情况的编译器行为 如果不是,那么一般来说,在没有多重继承的情况下,nullptr的静态_强制转换是安全的吗 A*易失性A_ptr=nullptr;//或者用B*换成A* 断言(!static_cast(a_ptr));//这有标准保证吗。? 编译器是否总是(在所有实现中)不执行调整 更一般地说(对于多重继承的情
| A | B | ( class B is derived from A )
0x0 0x8
当然,向下或向上投射时没有什么可调整的。
但标准中是否定义了针对这种情况的编译器行为
如果不是,那么一般来说,在没有多重继承的情况下,nullptr的静态_强制转换是安全的吗
A*易失性A_ptr=nullptr;//或者用B*换成A*
断言(!static_cast(a_ptr));//这有标准保证吗。?
编译器是否总是(在所有实现中)不执行调整
更一般地说(对于多重继承的情况),编译器可以在静态_cast中调整nullptr吗
相关,也未回答。
nullptr
的静态\u cast始终是安全的。无论您的类布局是什么,您都可以在类层次结构中进行static_cast
nullptr,并将定义强制类型的结果-nullptr
保证从nullptr
强制转换的任何类型将导致nullptr
可在标准5.2.9中找到:
类型为“指向cv1 B的指针”的prvalue,其中B是类类型,可以
转换为“pointerto cv2 D”类型的PR值,其中D是一个类
从B派生(第10条),如果从
存在“指向D的指针”到“指向B的指针”(4.10),cv2相同
cv资格为或大于cv1,且B为
既不是D的虚拟基类,也不是虚拟基类的基类
D类。空指针值(4.10)转换为空指针值
目标类型的指针值
尽管
nullptr
可以隐式转换为任何指针类型,但在某些情况下,您可能需要显式转换,例如,在处理模板时。标准定义的行为是什么?在标准中,nullptr
的静态转换始终是未定义的行为。所以不,这绝对不安全。@JonathanMee什么<在nullptr
上的code>static_cast
是安全的。它会给您一个类型为强制转换的nullptr
。@NathanOliver,您是对的,我正在考虑在该方法上调用一个函数。我想你应该把答案写下来,但我不知道你为什么要写。NULL ptr
已经是指向匹配任何类型的NULL
的指针。@JonathanMee,例如,对于模板。@SergeyA,是否执行静态强制转换检查以通过\u ptr!=nullptr.?@GreenTree如果编译器需要调整指针以考虑布局差异,我相信它需要保留nullptr
的指针,所以不管需要做什么。在您的示例中,虽然没有必要进行调整,但也不需要进行检查。@Mark Ransom,您谈论的是优化,但这样的检查一般都会进行吗。?请用这本书中的引文发布一个答案。
A * volatile a_ptr = nullptr ; // or change with B * and cast to A *
assert( ! static_cast< B * >( a_ptr ) ) ; // is that guaranteed by Standard.?