20 General utilities library [utilities] (original) (raw)
20.14 Function objects [function.objects]
20.14.9 Concept-constrained comparisons [range.cmp]
In this subclause, BUILTIN-PTR-CMP(T, op, U) for types Tand U and where op is an equality ([expr.eq]) or relational operator ([expr.rel]) is a boolean constant expression.
BUILTIN-PTR-CMP(T, op, U) is true if and only if opin the expression declval<T>() op declval<U>() resolves to a built-in operator comparing pointers.
struct ranges::equal_to { template<class T, class U> requires equality_comparable_with<T, U> || _BUILTIN-PTR-CMP_(T, ==, U) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
Preconditions: If the expression std::forward<T>(t) == std::forward<U>(u)results in a call to a built-in operator == comparing pointers of typeP, the conversion sequences from both T and U to Pare equality-preserving ([concepts.equality]).
Effects:
- If the expression std::forward<T>(t) == std::forward<U>(u) results in a call to a built-in operator == comparing pointers: returns false if either (the converted value of) t precedesu or u precedes t in the implementation-defined strict total order over pointers ([defns.order.ptr]) and otherwise true.
- Otherwise, equivalent to:return std::forward<T>(t) == std::forward<U>(u);
struct ranges::not_equal_to { template<class T, class U> requires equality_comparable_with<T, U> || _BUILTIN-PTR-CMP_(T, ==, U) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
operator() has effects equivalent to:return !ranges::equal_to{}(std::forward<T>(t), std::forward<U>(u));
struct ranges::greater { template<class T, class U> requires [totally_ordered_with](concept.totallyordered#concept:totally%5Fordered%5Fwith "18.5.4 Concept totally_ordered [concept.totallyordered]")<T, U> || _BUILTIN-PTR-CMP_(U, <, T) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
operator() has effects equivalent to:return ranges::less{}(std::forward<U>(u), std::forward<T>(t));
struct ranges::less { template<class T, class U> requires [totally_ordered_with](concept.totallyordered#concept:totally%5Fordered%5Fwith "18.5.4 Concept totally_ordered [concept.totallyordered]")<T, U> || _BUILTIN-PTR-CMP_(T, <, U) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
Preconditions: If the expression std::forward<T>(t) < std::forward<U>(u) results in a call to a built-in operator < comparing pointers of type P, the conversion sequences from both T and U to P are equality-preserving ([concepts.equality]).
For any expressionsET and EU such that decltype((ET)) is T anddecltype((EU)) is U, exactly one ofranges::less{}(ET, EU),ranges::less{}(EU, ET), orranges::equal_to{}(ET, EU)is true.
Effects:
- If the expression std::forward<T>(t) < std::forward<U>(u) results in a call to a built-in operator < comparing pointers: returns true if (the converted value of) t precedes u in the implementation-defined strict total order over pointers ([defns.order.ptr]) and otherwise false.
- Otherwise, equivalent to:return std::forward<T>(t) < std::forward<U>(u);
struct ranges::greater_equal { template<class T, class U> requires [totally_ordered_with](concept.totallyordered#concept:totally%5Fordered%5Fwith "18.5.4 Concept totally_ordered [concept.totallyordered]")<T, U> || _BUILTIN-PTR-CMP_(T, <, U) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
operator() has effects equivalent to:return !ranges::less{}(std::forward<T>(t), std::forward<U>(u));
struct ranges::less_equal { template<class T, class U> requires [totally_ordered_with](concept.totallyordered#concept:totally%5Fordered%5Fwith "18.5.4 Concept totally_ordered [concept.totallyordered]")<T, U> || _BUILTIN-PTR-CMP_(U, <, T) constexpr bool operator()(T&& t, U&& u) const;using is_transparent = _unspecified_;};
operator() has effects equivalent to:return !ranges::less{}(std::forward<U>(u), std::forward<T>(t));