你为什么不能接受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来调用这个函数时,我每次都得到一个不同的地址。 是否nullptr动态地分配一个地址及时进行比较等? 或者(可能更有可能)也许是编译器强制底层对象的临时副本?
当然这些都不是重要的信息,我只是觉得有趣的是为什么这个特定的限制被实现了(以及为什么我看到了我的行为)。
即使可以在给定值5
后取一个int
的地址,也是不能取5
的地址。 没关系的是, nullptr_t
没有其他值。
值没有地址; 对象做。
当你将这样一个值传递给一个const &
参数,或者将一个值绑定到一个const引用时,例如static_cast< T const & >( … )
或者声明一个命名参考T const & foo = …;
时,会生成一个临时对象T const & foo = …;
。 你看到的地址就是临时地址。
如果您遵循标准答案,§18.2 / 9将您的观察非常直白:
尽管不能使用nullptr的地址,但可以使用另一个作为左值的nullptr_t对象的地址。
或者,§2.14.7对nullptr
说:
指针文字是关键字nullptr。 这是一个std :: nullptr_t类型的值。
那么什么是价值? §3.10 / 1回答如下:
一个prvalue(“纯”右值)是一个不是xvalue的右值。 [例子:调用返回类型不是引用的函数的结果是一个prvalue。 诸如12,7.3e5或true这样的字面值也是一个值。 - 结束示例]
希望在这个例子中尝试使用这些东西的地址将更有意义,因为你为什么不能使用nullptr
的地址。 这是这些例子的一部分!
nullptr
是一个(文字)常量,并且它们没有内存地址,就像代码中的任何其他文字常量一样。 它类似于0
,但是使用特殊的std::nullptr_t
类型而不是void*
来避免重载(指针与整数)问题。
但是,如果您使用值nullptr
定义自己的变量,则它具有内存地址,因此您可以使用它的地址。
对于任何其他类型的字面常量(在C ++中属于类别prvalue),这同样适用,因为字面常量没有存储在程序中(仅作为它们出现的表达式的一部分),所以它不会有什么意义谈论地址。 然而,常量变量确实有地址,以指出区别。
链接地址: http://www.djcxy.com/p/73013.html