[concept.equalitycomparable] # 18 Concepts library [[concepts]](./#concepts) ## 18.5 Comparison concepts [[concepts.compare]](concepts.compare#concept.equalitycomparable) ### 18.5.4 Concept equality_comparable [concept.equalitycomparable] [🔗](#concept:weakly-equality-comparable-with) `template concept [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") = // exposition only requires(const remove_reference_t& t, const remove_reference_t& u) { { t == u } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2 Boolean testability [concept.booleantestable]"); { t != u } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2 Boolean testability [concept.booleantestable]"); { u == t } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2 Boolean testability [concept.booleantestable]"); { u != t } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2 Boolean testability [concept.booleantestable]"); }; ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1041) Given types T and U, let t and u be lvalues of typesconst remove_reference_t andconst remove_reference_t respectively[.](#1.sentence-1) T and U model[*weakly-equality-comparable-with*](#concept:weakly-equality-comparable-with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") only if - [(1.1)](#1.1) t == u, u == t, t != u, and u != t have the same domain[.](#1.1.sentence-1) - [(1.2)](#1.2) bool(u == t) == bool(t == u)[.](#1.2.sentence-1) - [(1.3)](#1.3) bool(t != u) == !bool(t == u)[.](#1.3.sentence-1) - [(1.4)](#1.4) bool(u != t) == bool(t != u)[.](#1.4.sentence-1) [🔗](#concept:equality_comparable) `template concept [equality_comparable](#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") = [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]"); ` [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1063) Let a and b be objects of type T[.](#2.sentence-1) T models [equality_comparable](#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") only ifbool(a == b) is true when a is equal tob ([[concepts.equality]](concepts.equality "18.2 Equality preservation")), and false otherwise[.](#2.sentence-2) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1069) [*Note [1](#note-1)*: The requirement that the expression a == b is equality-preserving implies that == is transitive and symmetric[.](#3.sentence-1) — *end note*] [🔗](#concept:equality_comparable_with) `template concept [equality_comparable_with](#concept:equality_comparable_with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") = [equality_comparable](#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") && [equality_comparable](#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") && [comparison-common-type-with](concept.comparisoncommontype#concept:comparison-common-type-with "18.5.3 Comparison common types [concept.comparisoncommontype]") && [equality_comparable](#concept:equality_comparable "18.5.4 Concept equality_­comparable [concept.equalitycomparable]")< common_reference_t< const remove_reference_t&, const remove_reference_t&>> && [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]"); ` [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1089) Given types T and U, let t and t2 be lvalues denoting distinct equal objects of types const remove_reference_t andremove_cvref_t, respectively, let u and u2 be lvalues denoting distinct equal objects of types const remove_reference_t andremove_cvref_t, respectively, and let C be:common_reference_t&, const remove_reference_t&>T and U model[equality_comparable_with](#concept:equality_comparable_with "18.5.4 Concept equality_­comparable [concept.equalitycomparable]") only ifbool(t == u) == bool(*CONVERT_TO_LVALUE*(t2) == *CONVERT_TO_LVALUE*(u2))