为什么不能取nullptr的地址?

mon*_*506 41 c++ std nullptr c++11

在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));
}
Run Code Online (Sandbox Code Playgroud)

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

error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

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

当然,这些都不是至关重要的信息,我只是觉得有趣的是为什么要实施这一特定的限制(以及随后为什么我会看到我的行为).

Pot*_*ter 80

它是相同的,因为5即使你可以int在给它值之后取一个地址,也无法获取地址5.没有替代价值并不重要nullptr_t.

值没有地址; 对象呢.

将此类值传递给const &参数时会生成临时对象,或者将值绑定到const引用,例如通过static_cast< T const & >( … )或声明命名引用T const & foo = …;.你看到的地址是临时的.

  • 是的,`nullptr`是一个表示文字的关键字.就像`true`和`false`(你不能做'&true`). (19认同)
  • 谢谢!我实际上是在挖掘更多的东西,我偶然发现[这个相关问题的答案](http://stackoverflow.com/questions/6664115/is-nullptr-not-a-special-keyword-and-an-object -of-stdnullptr-T/6664283#6664283).然后我突然意识到**nullptr**是一个空指针文字,是吗?有意义的是,你无法获取文字的地址.:) (2认同)

chr*_*ris 27

如果您正在接受标准答案,§18.2/ 9会非常坦率地表达您的观察结果:

虽然无法获取nullptr的地址,但可以采用另一个作为左值的nullptr_t对象的地址.

或者,§2.14.7说明了这一点nullptr:

指针文字是关键字nullptr.它是std :: nullptr_t类型的prvalue.

什么是prvalue?§3.10/ 1回答:

prvalue("纯"rvalue)是一个不是xvalue的rvalue.[示例:调用返回类型不是引用的函数的结果是prvalue.诸如12,7.3e5或true之类的文字的值也是prvalue. - 结束例子]

希望尝试在示例中获取任何这些内容的地址将更有意义,为什么你不能采取的地址nullptr.这是这些例子的一部分!

  • 啊,我直到现在才知道prvalue是什么,+1. (2认同)

lee*_*mes 10

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

但是如果你用值定义自己的变量nullptr,它有一个内存地址,所以你可以获取它的地址.

对于任何其他类型的任何其他文字常量(在C++中属于类别prvalue)也是如此,因为文字常量不存储在程序中(仅作为它们出现的表达式的一部分),这就是为什么它不存在谈谈地址是否有意义.但是,常量变量确实有地址,以指出差异.