我可以通过reinterpret_cast将int的空指针转换为long类型

C--*_*C-- 9 c++ type-conversion reinterpret-cast

int *pt = 0;
long i = reinterpret_cast<long>(pt);

我保证是0吗?这是明确定义还是实现定义?我检查了c ++标准,但它只说明了这一点

指向数据对象或函数(但不是指向成员的指针)的指针可以转换为足以包含它的任何整数类型.

在这种情况下,pt不指向任何数据对象.该规则适用于此案吗?

GMa*_*ckG 8

,i不一定是任何价值.结果是实现定义的.

在C++中,指针的表示是实现定义的,包括空指针的表示.为指针指定整数值零时,将该指针设置为实现定义的空指针值,该值不一定是全位零.将该值转换为整数的结果是通过传递性实现定义的.

但更麻烦的是,完成的映射reinterpret_cast 无论如何都是实现定义的.因此,即使空指针值是全位 - 零,一个实现也可以自由地产生它想要的结果.您只能保证在退回时获得原始值.

大家都说,你的报价后面的下一句话包括说明:

[注意:对于那些了解底层机器的寻址结构的人来说,这并不奇怪. - 尾注]

因此,即使不需要特定的映射,实际上你可以采取有根据的猜测.


假设long足够大.在C++ 0x中使用uintptr_t,可选择在<cstddef>.