[ub] Justification for < not being a total order on pointers?

James Dennett jdennett at google.com
Thu Oct 17 22:07:15 CEST 2013


On Thu, Oct 17, 2013 at 12:41 PM, Gabriel Dos Reis <gdr at axiomatics.org> wrote:
> James Dennett <jdennett at google.com> writes:
>
> | On Thu, Oct 17, 2013 at 8:19 AM, Gabriel Dos Reis <gdr at axiomatics.org> wrote:
> | > Nevin Liber <nevin at eviloverlord.com> writes:
> | >
> | > | But, even if segmented architectures, unlikely though it is, do come back, the
> | > | ordering problem still has to be addressed, as std::less<T*> is required to
> | > | totally order pointers.  I just want operator< to be an alternate spelling for
> | > | that property.
> | >
> | > I will repeat this again: std::less<T*> is absolutely not a problem,
> | > because this
> | >
> | >       return intptr_t(p) < intptr_t(q);
> | >
> | > is valid and portable definition that requires no other special handling.
> |
> | I think it's not useful though; nothing guarantees that p == q =>
> | intptr_t(p) ==intptr_t(q), so far as I know,
>
> How do you arrive to this conclusion?

As always, it's hard to point to where something is _not_ specified.

I'm aware of no such guarantee.  If you're aware of one, you can
presumably cite it, and I'd appreciate such a citation.  All I see is
"A pointer can be explicitly converted to any integral type large
enough to hold it. The mapping function is implementation-defined."
We can debate whether the word "function" there should be taken in a
pure mathematical sense, and whether "a pointer" means the value
rather than the representation, and if we have just the right reading
(it's a function on pointer values) then we get that equal pointers
have equal values when converted to intptr_t.  We don't have any
guarantee about whether it's an order-preserving function though,
unless that's somewhere else.

-- James


More information about the ub mailing list