首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是nullptr吗?

这是nullptr吗?
EN

Stack Overflow用户
提问于 2014-05-13 18:29:44
回答 3查看 524关注 0票数 5

阅读this问答,我认为p不应该是nullptr,即使x0。我明白了吗?

代码语言:javascript
复制
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**?**

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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注释类型。

票数 11
EN

Stack Overflow用户

发布于 2014-05-13 18:52:22

ISO/IEC 14882:2011§4.10/1 (成员指针为4.11/1)仅说明计算为零的整数类型的积分常量表达式prvalue为空指针常量。

对于整数值,唯一的要求是第5.2.10/5节,其中规定:

一个指针转换成一个足够大小的整数(如果在实现中存在这样的话),并返回到相同的指针类型,它将有它的原始值;指针和整数之间的映射是实现定义的。

因此,它还定义了整数值0是否转换为空指针的实现。在大多数实现中,它是这样做的,因为这样更容易。

票数 2
EN

Stack Overflow用户

发布于 2014-05-13 18:37:16

让我们试着回答你的问题:

reinterpret_cast<void*>(x) != nullptr if int x = 0是可能的。但它并没有被强制执行。实际上,在大多数平台上,reinterpret_cast<void*>(x) == nullptr都是未定义的行为,但取决于这两种平台。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23638947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档