阅读this问答,我认为p不应该是nullptr,即使x是0。我明白了吗?
int main()
{
int x = 0;
std::cin >> x; // Enter `0`
void *p = (void *)x; // or: void *p = reinterpret_cast<void*>(x);
if (!p)
std::cout << "p is nullptr" << std::endl;
}在标准输入中输入0后,p is nullptr将显示在我的GCC中。根据link,它不应该评估为nullptr,但结果并不像我预期的那样。
是代码未定义的行为吗?或者没有具体的结果?为什么它要评估为nullptr**?**
发布于 2014-05-13 18:44:43
从C++11 5.2.10/5重新解释cast expr.reinterpret.cast
整数类型或枚举类型的值可以显式转换为指针。一个指针转换成一个足够大的整数(如果在实现中存在这样的话),并返回到相同的指针类型,它将有它的原始值;指针和整数之间的映射是实现定义的。
A 5.2.10/4中的相关bit:
类型std::nullptr_t的值可以转换为整数类型;转换的意义和有效性与将(void*)0转换为整数类型的意义和有效性相同。注意:不能使用reinterpret_cast将任何类型的值转换为std::nullptr_t. -end注释类型。
发布于 2014-05-13 18:52:22
ISO/IEC 14882:2011§4.10/1 (成员指针为4.11/1)仅说明计算为零的整数类型的积分常量表达式prvalue为空指针常量。
对于整数值,唯一的要求是第5.2.10/5节,其中规定:
一个指针转换成一个足够大小的整数(如果在实现中存在这样的话),并返回到相同的指针类型,它将有它的原始值;指针和整数之间的映射是实现定义的。
因此,它还定义了整数值0是否转换为空指针的实现。在大多数实现中,它是这样做的,因为这样更容易。
发布于 2014-05-13 18:37:16
让我们试着回答你的问题:
reinterpret_cast<void*>(x) != nullptr if int x = 0是可能的。但它并没有被强制执行。实际上,在大多数平台上,reinterpret_cast<void*>(x) == nullptr都是未定义的行为,但取决于这两种平台。
https://stackoverflow.com/questions/23638947
复制相似问题