I noticed the non-ranges version requires that the compare predicate is a BinaryPredicate [alg.sorting.general.2], but the ranges version requires std::indirect_strict_weak_order
[lower.bound] (which bans me to use less_equal).
I searched stackoverflow but only found a question about whether there's a difference, also none of the answerer explained why there's a difference. So I open this question hoping to figure this out.