在此回答的评论中,我偶然看到了有关“有效指针”的讨论。由于我认为这一点通常很有趣:
在C++中,“有效指针”是什么?
具体而言:
在C++中,“有效指针”是什么?
具体而言:
reinterpret_cast<const void*>(0x1)
是有效指针吗?reinterpret_cast<const void*>(0x1)
是有效指针吗?标准将实现分为两个一般类别:
您的表达式绝对不是一个安全派生指针,因此在第一种情况下是无效的。
引用自3.7.4.3:
一个实现可能具有放宽指针安全性,在这种情况下,指针值的有效性不取决于它是否是安全派生的指针值。或者,实现可能具有严格的指针安全性,在这种情况下,如果指向具有动态存储期的对象的指针值不是安全派生的指针值,则该指针值是无效的指针值,除非引用的完整对象已被声明为可达(20.7.4)。【注:使用无效的指针值(包括将其传递给解分配函数)的效果是未定义的,请参阅3.7.4.2。即使不安全派生的指针值可能与某些安全派生的指针值相等,这也是正确的。 - 结束说明】不管实现是否具有放宽或严格的指针安全性,都是由实现定义的。
对于具有放宽安全性的实现,指针值如何获取并不重要,只要满足以下条件(3.9.2):
对象指针类型的有效值表示内存中字节的地址(1.7)或空指针。
0x1
在您的系统上是否为有效的内存地址? 对于某些嵌入式系统来说是的。 对于大多数使用虚拟内存的操作系统,从零开始的页面被保留为无效页面。
::operator delete()
)。 - Ben Voigtconstexpr
指针的,而constexpr
明确禁止具有未定义行为的表达式(例如越界数组访问)。因此,虽然您可能能够使用平台定义的重新解释地址,但它不允许作为常量表达式...(尽管我想我们知道这一点)。 - Kerrek SBreinterpret_cast
,所以它不是一个合法的常量表达式。 - Ben Voigtp + 0
不是未定义行为。它可能没问题,但你无法知道(从语言内部)。如果在你的平台上没问题,那就是你引入的外部信息。 - Kerrek SB