在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 = …;
。 你看到的地址是临时的那个。
如果你是一个标准的答案后,第18.2 / 9把你的观察很不客气地说:
尽管nullptr的地址不能取,另一个nullptr_t对象,它是一个左值可以采取的地址。
另外,§2.14.7说,这大约nullptr
:
指针字面是关键字nullptr。 这是一个类型为std的prvalue :: nullptr_t。
那么,什么是prvalue? §3.10 / 1的答案是:
甲prvalue(“纯”右值)是一个rvalue这不是一个x值。 [实施例:在调用其返回类型不是一个引用是prvalue一个函数的结果。 文字,例如作为12,7.3e5,或真值也是一个prvalue。 - 端示例]
我们希望,试图利用任何在本例中的那些东西的地址会更有意义,为什么你不能把地址nullptr
。 它的那些例子的一部分!
nullptr
是(字面)不变,而这些没有一个内存地址,就像在你的代码中的任何其他字面常量。 它类似于0
,但特殊的std::nullptr_t
类型,而不是void*
避免超载(指针与整数)的问题。
但是如果你的价值定义自己的变量nullptr
,它有一个内存地址,所以你可以把它的地址。
这同样适用于其他任何常量(这在类别prvalue下C ++秋季)任何其他类型的,因为字面常量不存储在你的程序(只在那里发生的表达式的部分),这就是为什么它不任何意义谈论地址。 然而,不断变量确实有地址,点出差异。
无论真假都是关键字和文字他们有一个类型(布尔)。 nullptr是文字型STD nullptr_t的::一个指针,它是一个prvalue(你不能把它的使用和地址),也nullptr是prvalue所以你不能把它的地址,字面常量不保存在你的程序。
这是没有意义有地址。