你为什么不能接受nullptr的地址?

在C ++ 11标准,为什么服用nullptr是不允许的,而一个地址允许拿自己的std :: nullptr_t实例的地址,我不明白其中的道理。 除了nullptr是一个保留关键字的事实之外,这个决定是否有任何指定的推理?

仅仅因为它让我感到厌烦,我试图用下面的函数来绕过这个限制:

decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
    return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}

我不得不在参数上使用reinterpret_cast,因为没有它我得到了歇斯底里的错误:

error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]

当我通过直接传递nullptr来调用这个函数时,我每次都得到一个不同的地址。 是否nullptr动态地分配一个地址及时进行比较等? 或者(可能更有可能)也许是编译器强制底层对象的临时副本?

当然这些都不是重要的信息,我只是觉得有趣的是为什么这个特定的限制被实现了(以及为什么我看到了我的行为)。


即使可以在给定值5后取一个int的地址,也是不能取5的地址。 没关系的是, nullptr_t没有其他值。

值没有地址; 对象做。

当你将这样一个值传递给一个const &参数,或者将一个值绑定到一个const引用时,例如static_cast< T const & >( … )或者声明一个命名参考T const & foo = …;时,会生成一个临时对象T const & foo = …; 。 你看到的地址就是临时地址。


如果您遵循标准答案,§18.2 / 9将您的观察非常直白:

尽管不能使用nullptr的地址,但可以使用另一个作为左值的nullptr_t对象的地址。

或者,§2.14.7对nullptr说:

指针文字是关键字nullptr。 这是一个std :: nullptr_t类型的值。

那么什么是价值? §3.10 / 1回答如下:

一个prvalue(“纯”右值)是一个不是xvalue的右值。 [例子:调用返回类型不是引用的函数的结果是一个prvalue。 诸如12,7.3e5或true这样的字面值也是一个值。 - 结束示例]

希望在这个例子中尝试使用这些东西的地址将更有意义,因为你为什么不能使用nullptr的地址。 这是这些例子的一部分!


nullptr是一个(文字)常量,并且它们没有内存地址,就像代码中的任何其他文字常量一样。 它类似于0 ,但是使用特殊的std::nullptr_t类型而不是void*来避免重载(指针与整数)问题。

但是,如果您使用值nullptr定义自己的变量,则它具有内存地址,因此您可以使用它的地址。

对于任何其他类型的字面常量(在C ++中属于类别prvalue),这同样适用,因为字面常量没有存储在程序中(仅作为它们出现的表达式的一部分),所以它不会有什么意义谈论地址。 然而,常量变量确实有地址,以指出区别。

链接地址: http://www.djcxy.com/p/73013.html

上一篇: Why can't you take the address of nullptr?

下一篇: How does std::move() transfer values into RValues?