Std:: less <void> и типы указателей

std::less<T *> гарантированно обеспечивает общий порядок, независимо от того, указывают оба указателя в один и тот же массив.

В последнем черновике стандарта, то же самое верно для прозрачного объекта функции std::less<void> (std::less<>), когда вы вызываете его operator()?

Очевидно, что тот же вопрос относится к std::greater, но я предполагаю, что они указаны одинаково.

Ответ 1

В текущем черновике из github не содержится никакого языка для этого; на самом деле его определение less<> явно говорит "возвращает std::forward<T>(t) < std::forward<U>(u)", что будет undefined для несравнимых указателей. Поэтому... не делай этого, я полагаю.

Если вам нужен гетерогенный компаратор-указатель, лучше всего написать свой собственный предикат шаблона, который в подходящий момент использует std::less<T*>().

Ответ 2

std::less<void> - это поведение undefined. std::less требуется либо тип указателя (для которого существует специальное правило), либо тип, для которого определен <.