阅读this Q& A,即使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中。
根据{{3}},它不应评估为nullptr
,但结果不符合我的预期。
代码是否未定义?或未指明的结果?为什么评估为nullptr
?
答案 0 :(得分:11)
From C ++ 11 5.2.10 / 5重新解释cast [expr.reinterpret.cast](强调添加):
可以明确表示整数类型或枚举类型的值 转换为指针。指针转换为足够的整数 size(如果实现上存在任何此类)并返回相同的大小 指针类型将具有其原始值; 指针之间的映射 和整数是实现定义的。
5.2.10 / 4中的相关位:
std :: nullptr_t类型的值可以转换为整数类型; 转换具有与转换相同的含义和有效性 (void *)0到整数类型。 [注意:reinterpret_cast不能 用于将任何类型的值转换为类型std :: nullptr_t。 -结束 注意]
答案 1 :(得分:2)
ISO / IEC 14882:2011§4.10/ 1(以及成员指针的§4.11/ 1)仅表示_constant整数表达式整数类型的整数常量表达式prvalue,其计算结果为零是一个空指针常量。
对于整数值,唯一的要求是§5.2.10/ 5,其中说:
转换为足够大小的整数的指针(如果实现上存在任何此类)并返回相同的指针类型将具有其原始值;指针和整数之间的映射是以实现方式定义的。
因此,实现也定义了整数值0是否转换为空指针。在大多数实现中都是如此,因为这样更容易。
答案 2 :(得分:1)
让我们试着回答你的问题:
可能 reinterpret_cast<void*>(x) != nullptr
如果int x = 0
。但它没有强制要求。实际上,大多数平台上的reinterpret_cast<void*>(x) == nullptr
,但取决于其中一个是未定义的行为。