[range.cmp] # 22 General utilities library [[utilities]](./#utilities) ## 22.10 Function objects [[function.objects]](function.objects#range.cmp) ### 22.10.9 Concept-constrained comparisons [range.cmp] [🔗](#lib:equal_to) struct ranges::equal_to {templateconstexpr bool operator()(T&& t, U&& u) const; using is_transparent = *unspecified*;}; [🔗](#itemdecl:1) `template constexpr bool operator()(T&& t, U&& u) const; ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12601) *Constraints*: T and U satisfy [equality_comparable_with](concept.equalitycomparable#concept:equality_comparable_with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12605) *Preconditions*: If the expression std​::​forward(t) == std​::​forward(u) results in a call to a built-in operator == comparing pointers of typeP, the conversion sequences from both T and U to P are equality-preserving ([[concepts.equality]](concepts.equality "18.2 Equality preservation")); otherwise, T and U model [equality_comparable_with](concept.equalitycomparable#concept:equality_comparable_with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12613) *Effects*: - [(3.1)](#3.1) If the expression std​::​forward(t) == std​::​forward(u) results in a call to a built-in operator == comparing pointers: returns false if either (the converted value of) t precedes u or u precedes t in the implementation-defined strict total order over pointers ([[defns.order.ptr]](defns.order.ptr "3.28 implementation-defined strict total order over pointers")) and otherwise true. - [(3.2)](#3.2) Otherwise, equivalent to: return std​::​forward(t) == std​::​forward(u); [🔗](#lib:not_equal_to) struct ranges::not_equal_to {templateconstexpr bool operator()(T&& t, U&& u) const; using is_transparent = *unspecified*;}; [🔗](#itemdecl:2) `template constexpr bool operator()(T&& t, U&& u) const; ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12645) *Constraints*: T and U satisfy [equality_comparable_with](concept.equalitycomparable#concept:equality_comparable_with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12649) *Effects*: Equivalent to:return !ranges::equal_to{}(std::forward(t), std::forward(u)); [🔗](#lib:greater) struct ranges::greater {templateconstexpr bool operator()(T&& t, U&& u) const; using is_transparent = *unspecified*;}; [🔗](#itemdecl:3) `template constexpr bool operator()(T&& t, U&& u) const; ` [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12673) *Constraints*: T and U satisfy [totally_ordered_with](concept.totallyordered#concept:totally_ordered_with "18.5.5 Concept totally_­ordered [concept.totallyordered]")[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12677) *Effects*: Equivalent to:return ranges::less{}(std::forward(u), std::forward(t)); [🔗](#lib:less) struct ranges::less {templateconstexpr bool operator()(T&& t, U&& u) const; using is_transparent = *unspecified*;}; [🔗](#itemdecl:4) `template constexpr bool operator()(T&& t, U&& u) const; ` [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12701) *Constraints*: T and U satisfy [totally_ordered_with](concept.totallyordered#concept:totally_ordered_with "18.5.5 Concept totally_­ordered [concept.totallyordered]")[.](#8.sentence-1) [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12705) *Preconditions*: If the expression std​::​forward(t) < std​::​forward(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]](concepts.equality "18.2 Equality preservation")); otherwise, T and U model [totally_ordered_with](concept.totallyordered#concept:totally_ordered_with "18.5.5 Concept totally_­ordered [concept.totallyordered]")[.](#9.sentence-1) 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[.](#9.sentence-2) [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12720) *Effects*: - [(10.1)](#10.1) If the expression std​::​forward(t) < std​::​forward(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]](defns.order.ptr "3.28 implementation-defined strict total order over pointers")) and otherwise false. - [(10.2)](#10.2) Otherwise, equivalent to:return std​::​forward(t) < std​::​forward(u); [🔗](#lib:greater_equal) struct ranges::greater_equal {templateconstexpr bool operator()(T&& t, U&& u) const; using is_transparent = *unspecified*;}; [🔗](#itemdecl:5) `template constexpr bool operator()(T&& t, U&& u) const; ` [11](#11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12752) *Constraints*: T and U satisfy [totally_ordered_with](concept.totallyordered#concept:totally_ordered_with "18.5.5 Concept totally_­ordered [concept.totallyordered]")[.](#11.sentence-1) [12](#12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12756) *Effects*: Equivalent to:return !ranges::less{}(std::forward(t), std::forward(u)); [🔗](#lib:less_equal) `struct ranges::less_equal { template constexpr bool operator()(T&& t, U&& u) const; using is_transparent = unspecified; }; ` [🔗](#itemdecl:7) `template constexpr bool operator()(T&& t, U&& u) const; ` [13](#13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12780) *Constraints*: T and U satisfy [totally_ordered_with](concept.totallyordered#concept:totally_ordered_with "18.5.5 Concept totally_­ordered [concept.totallyordered]")[.](#13.sentence-1) [14](#14) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L12784) *Effects*: Equivalent to:return !ranges::less{}(std::forward(u), std::forward(t));