此指针比较是否未指定或等效?

jac*_*k X 1 c++ language-lawyer

考虑这种情况,其来源自https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html

int main(){
    auto x = new int[8];
    auto y = new int[8];
    y[0] = 42;
    auto x_ptr = x+8; // one past the end
    if (x_ptr == &y[0]){
         // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,假设 x 和 y 已被分配到彼此相邻的位置,其中 y 具有较高的地址。

根据[expr.eq] p3

比较指针的定义如下:

  • 如果一个指针代表一个完整对象的地址,而另一个指针代表另一个完整对象的最后一个元素之后的地址,则比较的结果是未指定的。
  • 否则,如果指针都为空,都指向同一个函数,或者都表示相同的地址,则它们比较相等。

x都不y指向一个完整的对象,它们最初指向数组的元素,这是一个子对象。因此,第一条似乎不适用于本案。因此,第二个项目符号适用于此处,因为它紧接在最初指向的y数组之后。x那么,对比一下true,对吗?

Hol*_*Cat 5

"指向"!="代表"的地址"。在第一个项目符号中:

如果一个指针代表一个完整对象的地址......

(粗体我的)

y不“指向”一个完整的对象(它指向一个数组元素,也称为它的子对象),但y“表示”一个完整对象的地址,因为它在数字上等于整个数组的地址。

从您在评论中发布的段落中:[basic.compound]/3

指向或超过对象末尾的指针类型的值表示对象34占用的内存中第一个字节([intro.memory])的地址或对象末尾之后的内存中第一个字节的地址。分别由对象占用的存储空间。