A comparação de ponteiros é um comportamento indefinido ou não especificado em C ++?

A linguagem de programação C ++, terceira edição da Stroustrup, diz que,

Subtração de ponteiros é definida apenas quando ambos apontam para elementos da mesma matriz (embora a linguagem não tenha uma maneira rápida de garantir que seja esse o caso). Ao subtrair um ponteiro de outro, o resultado é o número de elementos da matriz entre os dois ponteiros (um número inteiro). Pode-se adicionar um número inteiro a um ponteiro ou subtrair um número inteiro de um ponteiro; nos dois casos, o resultado é um valor de ponteiro.Se esse valor não apontar para um elemento da mesma matriz que o ponteiro original ou um além, o resultado do uso desse valor será indefinido.

Por exemplo:

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

Eu estava lendo sobrecomportamento não especificado na Wikipedia. Isso diz que

Em C e C ++, a comparação de ponteiros com objetos é definida estritamente apenas se os ponteiros apontarem para membros do mesmo objeto ou elementos da mesma matriz.

Exemplo:

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

Então, eu estou confuso. Qual deles está correto? Wikipedia ou livro de Stroustrup? O padrão C ++ diz sobre isso?

Corrija-me Se estou entendendo algo errado.

questionAnswers(1)

yourAnswerToTheQuestion