这是一个nullptr吗?

时间:2014-05-13 18:29:44

标签: c++

阅读this Q& A,即使pnullptr,我认为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

3 个答案:

答案 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 ,但取决于其中一个是未定义的行为。