你为什么不能采取nullptr的地址?(Why can't you take the add

2019-08-05 20:01发布

在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动态分配刚刚在时间比较和这样的地址? 或(可能更容易),也许是编译器迫使底层对象的临时副本?

当然,这一切都不是重要的信息,我只是觉得很有意思,为什么这个特殊的限制开始实施(以及随后为什么我看到我的行为)。

Answer 1:

这是同样不能够采取的地址5 ,即使你可以采取的地址int给它的价值后, 5 。 这不要紧,有一个没有替代值nullptr_t有。

值没有地址; 物体做。

当你经过这样一个值,以一个生成一个临时对象const &参数,或以其他方式的值绑定到const引用,诸如通过static_cast< T const & >( … )或声明名为参考T const & foo = …; 。 你看到的地址是临时的那个。



Answer 2:

如果你是一个标准的答案后,第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 。 它的那些例子的一部分!



Answer 3:

nullptr是(字面)不变,而这些没有一个内存地址,就像在你的代码中的任何其他字面常量。 它类似于0 ,但特殊的std::nullptr_t类型,而不是void*避免超载(指针与整数)的问题。

但是如果你的价值定义自己的变量nullptr ,它有一个内存地址,所以你可以把它的地址。

这同样适用于其他任何常量(这在类别prvalue下C ++秋季)任何其他类型的,因为字面常量不存储在你的程序(只在那里发生的表达式的部分),这就是为什么它不任何意义谈论地址。 然而,不断变量确实有地址,点出差异。



Answer 4:

无论真假都是关键字和文字他们有一​​个类型(布尔)。 nullptr是文字型STD nullptr_t的::一个指针,它是一个prvalue(你不能把它的使用和地址),也nullptr是prvalue所以你不能把它的地址,字面常量不保存在你的程序。

这是没有意义有地址。



文章来源: Why can't you take the address of nullptr?