Example: Constrained algorithms
The C++20 algorithms in std::ranges have well-defined constraints on the arguments:
template <std::random_access_iterator I, std::sentinel_for<I> S,
typename Comp = ranges::less, class Proj = std::identity>
requires std::sortable<I, Comp, Proj>
constexpr I sort(I first, S last, Comp comp = {}, Proj proj = {});
template<ranges::random_access_range R, typename Comp = ranges::less,
class Proj = std::identity>
requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R>
sort(R&& r, Comp comp = {}, Proj proj = {});