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

Gabriel Dos Reis gdr at axiomatics.org
Thu Oct 17 16:28:12 CEST 2013


Nevin Liber <nevin at eviloverlord.com> writes:

| On 16 October 2013 10:06, Gabriel s too subtle for even most committee members,
| let alone mere mortals, to get right.Dos Reis <gdr at microsoft.com> wrote:
| 
| 
|     |       I would not have trouble telling people (especially notices):
|     "Ignore expect
|     | talks
|     |       about operator< on pointers.  Prefer std::less<T>, unless you meant
|     a
|     | relationship
|     |       between objects pointed to, in which use operator<.  Mean what you
|     say
|     | and say
|     |       what you mean."
|     |
|     |
|     |
|     | So what about std::less<void>?  Should people be using it?
| 
|     What is wrong about it?
| 
| 
| It requires operator<.  If people specialize std::less<T> instead adding an
| operator<, it won't work.  It would be surprising that:
| 
| set<T, less<T>> works, but
| set<T, less<>> does not.
| 
| One of the two motivations for this in n3421 is to not require that the
| argument type in a comparator functor be explicitly specified, but that assumes
| there is an operator< for the type, or possible compiler magic for pointer
| comparisons because of the ub issue.

If your goal is to make std::less an alternate syntax for operator<,
then from that logic, it would not make much difference to require
std::less<void> to use std::less<T> instead of operator<.  Therefore,
there would be no difference between

   set<T, less<T>> 
  | set<T, less<>>


-- Gaby



More information about the ub mailing list