я вот значит про std::less докладываю практически из траншей,
потому что те кто могли бы и подсказать – не подсказывают.
но нет! надо просто ездить в правильные места
и ходить на фику с правильными людьми.

вообще институт фики в Швеции совершенно изумителен:
сидят люди, решают серьезные проблемы
(“у меня тут идея! давайте сделаем Х и тем самым Y, Z и даже W?!”),
стучат кулаками по столу в поисках синергии, key results и коммитментов,
один с озабоченным выражением лица размашисто нарезает вокруг стола нервные хорды,

и вдруг – дверь открывается –
и девушка с волосами цвета льна ослепительно улыбается зубами
и словно колокольчик журчит:
фика!

и тут же все Очень Озабоченные и крайне Серьезные люди мгновенно забывают о смертельном смысле сочетания слов “opportunity” и “alignment”,
и, совершенно изменившиеся, искренне улыбаются, болтают о всяком,
в окутанном чудесным ароматом свежего кофе волшебстве фики,
в непринужденном флирте чашечки кофе, микроподарка из bakery
и дружеского разговора о другом.

– слышал, std::less и std::greater теперь совместимы?
– неужели?! я всё пропустил!
– представляешь, еще в мае оказывается, предложили новый wording.
– и что там теперь? неужели ввели по-настоящему Общий Для Всех, тотальный, ордер?
– практически! вот новый текст:

-14- For templates greater, less, greater_equal, and less_equal, the specializations for any pointer type yield the same total order. That total order is consistent with the partial order imposed by the built-in operators <, >, <=, and >=. [Note: When a < b is well-defined for pointers a and b of type P, this implies (a < b) == less<P>(a, b), (a > b) == greater<P>(a, b), and so forth. — end note]
For template specializations greater<void>, less<void>, greater_equal<void>, and less_equal<void>, if the call operator calls a built-in operator comparing pointers, the call operator yields a total order. (DR 2562)

– и все понимающе улыбаются, благодарные и гордые за далеких но таких родных Воинов Света, от чистого сердца проливающих человекомесяцы своей жизни в борьбе за Тотальную Унификацию и искоренение Неопределенного Поведения Сиплюсплюса,
и дарящих нам всем эти хрустальные минуты,
минуты невинной радости человеческому бытию,
минуты кристально-ясной экзистенции,
– минуты фики.

@Zeux: А зачем приписка про void?
И что значит “if the call operator calls a built-in operator comparing pointers”

@aruslan: приписка про void - и, более конкретно, про call operator на std::less<void> - это такой изысканный способ легализовать

int *a, *b;
void* av = a; void* bv = b;
std::less<void>()(av, bv)

который понятное дело раньше был бессмысленнен потому что сравнивать можно только указатели на объекты одного типа внутри одного полного объекта или массива,
а объектов типа void как известно [**] не существует.
[**] но можно возвращать не только void но и const void.
[***] можно так же иметь массивы void, но только как параметры.
[****] в принципе у этого всего можно и sizeof брать, и alignof, если подумать.
[*****] но иногда лучше просто присоединиться к фике и получить свой кусочек радости.

(из Стокгольма, спецкор Порнографического Вестника Консерватории, члкоробщ вфорхб @aruslan.)

(оригинал на кружках)