Can pointers be totally ordered? Not in portable, standard C++. That's
why the standard requires the implementation to solve the problem, not
you. For any given representation of a pointer, it should be possible
to define an arbitrary total ordering, but how you do it will depend on
the the representation of a pointer.
For machines with a flat address space and byte addressing, just
treating the pointer as if it were a similarly sized integer or unsigned
integer is usually enough; this is how most compilers will handle
comparison within an object as well, so on such machines, there's no
need for the library to specialize std::less
et al. The "unspecified"
behavior just happens to do the right thing.
For word addressed machines (and there is at least one still in
production), it may be necessary to convert the pointers to void*
before the compiler native comparison will work.
For machines with segmented architectures, more work may be necessary.
It's typical on such machines to require an array to be entirely in one
segment, and just compare the offset in the segment; this means that if
a
and b
are two arbitrary pointers, you may end up with !(a < b) &&
!(b < a)
but not a == b
. In this case, the compiler must provide
specializations of std::less<>
et al for pointers, which (probably)
extract the segment and the offset from the pointer, and do some sort of
manipulation of them.
EDIT:
On other thing worth mentionning, perhaps: the guarantees in the C++
standard only apply to standard C++, or in this case, pointers obtained
from standard C++. On most modern systems, it's rather easy to mmap
the same file to two different address ranges, and have two pointers p
and q
which compare unequal, but which point to the same object.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…