Проверяя ссылки на другой вопрос, я заметил странное предложение в C ++ 11, в [expr.rel] ¶3:
Указатели на void
(после преобразования указателей) можно сравнить с результатом, определяемым следующим образом: Если оба
указатели представляют один и тот же адрес или оба являются нулевым значением указателя, результат равен true
, если оператор
<=
или >=
и false
в противном случае; в противном случае результат не указан.
Это, кажется, означает, что, как только два указателя были приведены к void *
, их отношение порядка больше не гарантируется; например, это:
int foo[] = {1, 2, 3, 4, 5};
void *a = &foo[0];
void *b = &foo[1];
std::cout<<(a < b);
может показаться неуказанным.
Интересно, что этот пункт отсутствовал в C ++ 03 и исчез в C ++ 14, поэтому, если мы возьмем приведенный выше пример и применим к нему формулировку C ++ 14, я бы сказал, что ¶3.1
- Если два указателя указывают на разные элементы одного и того же массива или его подобъектов, указатель на элемент с более высоким индексом сравнивается больше.
будет применяться, так как a
и b
указывают на элементы одного и того же массива, даже если они были преобразованы в void *
. Обратите внимание, что формулировка ¶3.1 была примерно такой же в C ++ 11, но, казалось, была переопределена предложением void *
.
Прав ли я в своем понимании? Какой смысл в этом странном предложении, добавленном в C ++ 11 и сразу удаленном? Или, может быть, он все еще там, но перенесен / подразумевается какой-то другой частью стандарта?