为什么你不能把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来调用这个函数时,我每次都得到一个不同的地址。 是nullptrdynamic地分配一个地址及时进行比较等? 或者(可能更可能)也许是编译器强制底层对象的临时副本?

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

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

值没有地址; 对象呢。

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

如果你是在一个标准的答案之后,§18.2 / 9很直白地说明你的观察:

尽pipenullptr的地址不能被采用,但是可以采用另一个是左值的nullptr_t对象的地址。

或者,§2.14.7对nullptr说:

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

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

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

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

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

但是,如果你使用nullptr定义你自己的variables,它有一个内存地址,所以你可以把它的地址。

对于任何其他types的字面常量(在C ++中属于类别prvalue ),任何其他types都是一样的,因为字面常量没有存储在程序中(仅作为expression式的一部分),所以它不会有什么意义谈论地址。 然而,常量variables确实有地址,指出了区别。

true和false都是关键字,而文字是文字(bool)。 nullptr是一个std :: nullptr_ttypes的指针字面值,它是一个prvalue(你不能使用&的地址),也是nullptr是prvalue所以你不能把它的地址,字面常量不存储在你的程序。

有地址没有意义。