Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无多重继承的指针调整_C++_Multiple Inheritance_Static Cast_Nullptr - Fatal编程技术网

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.?