Является ли сравнение указателей неопределенным или неопределенным поведением в C ++?

3-е издание Струструпа, язык программирования C ++, говорит, что

Вычитание указателей определяется только тогда, когда оба указателя указывают на элементы одного и того же массива (хотя в языке нет быстрого способа убедиться, что это так). При вычитании одного указателя из другого результатом является количество элементов массива между двумя указателями (целое число). Можно добавить целое число к указателю или вычесть целое число из указателя; в обоих случаях результатом является значение указателя.Если это значение не указывает на элемент из того же массива, что и исходный указатель, или за его пределы, результат использования этого значения не определен.

Например:

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

Я читал онеуточненное поведение в Википедии. Это говорит о том, что

В C и C ++ сравнение указателей с объектами строго определено, только если указатели указывают на элементы одного и того же объекта или элементы одного и того же массива.

Пример:

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

Итак, я в замешательстве. Который правильный? Википедия или книга Страуструпа? Что стандарт C ++ говорит об этом?

Поправьте меня, если я что-то неправильно понимаю.

Ответы на вопрос(1)

Ваш ответ на вопрос