https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78420
--- Comment #27 from Jonathan Wakely <redi at gcc dot gnu.org> --- Here's a really horrible case: #include <functional> #include <cassert> struct X { operator const X*() const { return this; } }; X x; X y; int main() { std::less<> lt; bool x_less_than_y = lt(x, y); bool y_less_than_x = lt(y, x); bool x_equal_to_y = !lt(x, y) && !lt(y, x); assert( ((int)x_less_than_y + (int)y_less_than_x + (int)x_equal_to_y) == 1 ); } This happens to give the right answer today, but I don't trust it to always do so. We can't dispatch to the special case for pointers that casts to uintptr_t because we can't know that we'll be comparing pointers (without std::experimental::invocation_type at least ... so I guess I finally have a use case for that).