Проверяя ссылки на другой вопрос, я заметил странное предложение в С++ 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);
казалось бы, не определено.
Интересно, что этот пункт отсутствовал в С++ 03 и исчез в С++ 14, поэтому, если мы возьмем приведенный выше пример и применим к нему формулировку С++ 14, я бы сказал, что ¶3.1
- Если два указателя указывают на разные элементы одного и того же массива или его подобъектов, указатель на элемент с более высоким индексом сравнивается больше.
будет применяться, так как a
и b
указывают на элементы одного и того же массива, даже если они были преобразованы в void *
. Обратите внимание, что формулировка ¶3.1 была примерно такой же в С++ 11, но, похоже, была отвергнута предложением void *
.
Правильно ли я понимаю? Какой смысл в этом странном предложении, добавленном в С++ 11 и сразу удаленном? Или, может быть, он все еще там, но перенесен/подразумевается какой-то другой частью стандарта?