指针比较是否在C++中未定义或未指定的行为?

Des*_*tor 7 c++ pointers undefined-behavior unspecified-behavior

Stroustrup的C++编程语言第3版说,

仅当两个指针指向同一数组的元素时才定义指针的减法(尽管该语言没有确保情况的快速方法).从另一个指针中减去一个指针时,结果是两个指针之间的数组元素数(一个整数).可以向指针添加整数或从指针中减去整数; 在这两种情况下,结果都是指针值. 如果该值未指向与原始指针相同的数组或超出原始指针的元素,则使用该值的结果是未定义的.

例如:

void f ()
{
    int v1 [10];
    int v2 [10];
    int i1 = &v1[5] - &v1[3];   // i1 = 2
    int i2 = &v1[5] - &v2[3];   // result undefined
}
Run Code Online (Sandbox Code Playgroud)

我正在阅读维基百科上未指明的行为.它说

在C和C++中,如果指针指向同一对象的成员或同一数组的元素,则仅严格定义指向对象的指针.

例:

int main(void)
{
  int a = 0;
  int b = 0;
  return &a < &b; /* unspecified behavior in C++, undefined in C */
}
Run Code Online (Sandbox Code Playgroud)

所以,我很困惑.哪一个是正确的?维基百科或Stroustrup的书?C++标准对此有何看法?

纠正我如果我误解了什么.

asc*_*ler 12

请注意,指针减法和指针比较是具有不同规则的不同操作.

C++ 14 5.6/6,关于减去指针:

除非两个指针指向同一个数组对象的元素或者指向数组对象的最后一个元素之后,否则行为是未定义的.

C++ 14 5.9/3-4:

比较指向对象的指针定义如下:

  • 如果两个指针指向同一数组的不同元素或其子对象,则指向具有较高下标的元素的指针比较大.

  • 如果一个指针指向一个数组的元素或指向其子对象,而另一个指针指向一个超过该数组的最后一个元素的指针,则后一指针比较大.

  • 如果两个指针指向同一对象的不同非静态数据成员,或者指向这些成员的子对象,则递归地指向后面声明的成员的指针比较更大,前提是这两个成员具有相同的访问控制并且提供了它们的类不是联盟.

如果两个操作数pq比较结果相同(5.10),p<=q以及p>=q二者的产量truep<qp>q双方产生错误的.否则,如果指针p不是一个指针比较较大q,p>=q,p>q,q<=p,和q<p所有的产量true,并且p<=q,p<q,q>=p,和q>p所有的产量false.否则,未指定每个运算符的结果.