The wording has changed in various editions of the C++ standard, and in the recent draft cited in the question. (See my comments on the question for the gory details.)
C++11 says:
Other pointer comparisons are unspecified.
C++17 says:
Otherwise, neither pointer compares greater than the other.
The latest draft, cited in the question, says:
Otherwise, neither pointer is required to compare greater than the other.
That change was made in response to an issue saying “”compares greater” term is needlessly confusing”.
If you look at the surrounding context in the draft standard, it’s clear that in the remaining cases the result is unspecified. Quoting from [expr.rel] (text in italics is my summary):
The result of comparing unequal pointers to objects is defined in
terms of a partial order consistent with the following rules:
[pointers to elements of the same array]
[pointers to members of the same object]
[remaining cases] Otherwise, neither pointer is required to compare greater than the other.
If two operands
p
andq
compare equal,p<=q
and
p>=q
both yieldtrue
andp<q
andp>q
both yield
false
. Otherwise, if a pointerp
compares greater than a pointerq,
p>=q,
p>q,
q<=p,
andq<p
all
yieldtrue
andp<=q
,p<q
,q>=p
, andq>p
all yieldfalse
. Otherwise, the result of each of the operators
is unspecified.
So the result of the <
operator in such cases is unspecified, but it does not have undefined behavior. It can be either true or false, but I don’t believe it’s required to be consistent. The program’s output could be any of 00
, 01
, 10
, or 11
.