C++ 为什么可以';你不知道nullptr的地址吗?
在C++11标准中,我不理解为什么不允许获取nullptr的地址,而允许一个获取自己的std::nullptr\t实例的地址。除了nullptr是一个保留关键字这一事实之外,这个决定还有什么特定的理由吗 只是因为它让我觉得有趣,我尝试使用以下函数绕过此限制:C++ 为什么可以';你不知道nullptr的地址吗?,c++,c++11,std,nullptr,C++,C++11,Std,Nullptr,在C++11标准中,我不理解为什么不允许获取nullptr的地址,而允许一个获取自己的std::nullptr\t实例的地址。除了nullptr是一个保留关键字这一事实之外,这个决定还有什么特定的理由吗 只是因为它让我觉得有趣,我尝试使用以下函数绕过此限制: decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept { return const_cast<decltype(nullptr)*>(re
decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}
当我通过直接传递nullptr调用此函数时,每次都会得到不同的地址。nullptr是否动态分配了一个地址,以便及时进行比较等?或者(可能更可能)编译器强制底层对象的临时副本
当然,这些都不是重要的信息,我只是觉得很有趣为什么要实施这个特定的限制(以及为什么我会看到我的行为).这与不能获取
5
的地址相同,即使您可以在给5
值后获取int
的地址。nullptr\t
没有替代值并不重要
值没有地址;对象可以
当您将此类值传递给const&
参数,或以其他方式将值绑定到const引用(例如通过static_cast(…)
或声明命名引用T const&foo=…)时,将生成临时对象代码>。您看到的地址是临时地址。nullptr
是一个(文字)常量,与代码中的任何其他文字常量一样,它们没有内存地址。它类似于0
,但属于特殊的std::nullptr\u t
类型,而不是void*
,以避免重载问题(指针与整数)
但是,如果您使用值nullptr
定义自己的变量,它有一个内存地址,所以您可以获取它的地址
<> P>对于任何其他类型的常数(在C++中属于任何其他类型的值)都是相同的,因为文字常量不存储在程序中(只是作为表达式的一部分,它们发生在这里),这就是为什么谈论地址没有任何意义。然而,常数变量确实有地址,以指出差异。如果你想要一个标准答案,§18.2/9非常直截了当地指出了你的观察结果:
尽管不能获取nullptr的地址,但另一个作为左值的nullptr_t对象的地址可以
被带走
或者,§2.14.7中提到了关于nullptr
:
指针文本是关键字nullptr。它是std::nullptr\t类型的PR值
那么什么是prvalue?§3.10/1回答如下:
prvalue(“纯”右值)是不是xvalue的右值。[示例:调用函数的结果]
其返回类型不是引用的是prvalue。文本(如12、7.3e5或true)的值为
也是一个prvalue。-结束示例]
希望,尝试获取示例中任何这些内容的地址将更有助于理解为什么不能获取nullptr
的地址。这是这些例子的一部分 true和false都是关键字,作为文本,它们有一个类型(bool)。nullptr是std::nullptr_t类型的指针文本,它是一个prvalue(不能使用&)获取它的地址),nullptr也是prvalue,因此不能获取它的地址,文本常量不存储在程序中
有地址没有意义。nullptr
是一个PR值。你不能记下那些人的地址+但是,对于错误消息,请发送1。谢谢!事实上,我在附近挖了更多的东西,我无意中发现了。然后我意识到nullptr是一个空指针文本,是吗?您无法获取文本的地址是有道理的。:)是的,nullptr
是一个表示文字的关键字。就像true
和false
(你也不能做&true
)。是的D我想当我读“空指针常量”时,我只是把它当作“逻辑常量”而不是“文字常量”来读。顺便说一下,祝贺你的最新答案:)啊,直到现在我还不知道prvalue是什么,+1。@SethCarnegie,我喜欢他们的定义。有时候,当我通过标准来完全定义某个东西时,它会让我想起递归。@SethCarnegie,我忘记了这一点,但如果它不仅仅是prvalues,那就看看其他类似的东西吧。@chris哦,太棒了,我没有看到,赞成。顺便说一句,我觉得有趣的是,(这个问题的)最上面的答案比你的多30票。我不知道为什么会这样。@SethCarnegie,在投了好几票之后,我的回答晚了一点,但真正让你在这个答案中“哦,哦”的是最后一句话,如果你注意到的话,上面的答案已经做到了,只是更简单,更直接。我的意思是作为一个证据,人们可以按照标准来理解为什么这是无效的。
error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]