Files
cppdraft_translate/cppdraft/concept/equalitycomparable.md
2025-10-25 03:02:53 +03:00

4.7 KiB
Raw Permalink Blame History

[concept.equalitycomparable]

18 Concepts library [concepts]

18.5 Comparison concepts [concepts.compare]

18.5.4 Concept equality_comparable [concept.equalitycomparable]

🔗

template<class T, class U> concept [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4Concept equality_­comparable[concept.equalitycomparable]") = // exposition only requires(const remove_reference_t<T>& t, const remove_reference_t<U>& u) { { t == u } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"); { t != u } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"); { u == t } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"); { u != t } -> [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"); };

1

#

Given types T and U, let t and u be lvalues of typesconst remove_reference_t andconst remove_reference_t respectively.

T and U modelweakly-equality-comparable-with<T, U> only if

  • (1.1)

    t == u, u == t, t != u, and u != t have the same domain.

  • (1.2)

    bool(u == t) == bool(t == u).

  • (1.3)

    bool(t != u) == !bool(t == u).

  • (1.4)

    bool(u != t) == bool(t != u).

🔗

template<class T> concept [equality_comparable](#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]") = [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<T, T>;

2

#

Let a and b be objects of type T.

T models equality_comparable only ifbool(a == b) is true when a is equal tob ([concepts.equality]), and false otherwise.

3

#

[Note 1:

The requirement that the expression a == b is equality-preserving implies that == is transitive and symmetric.

— end note]

🔗

template<class T, class U> concept [equality_comparable_with](#concept:equality_comparable_with "18.5.4Concept equality_­comparable[concept.equalitycomparable]") = [equality_comparable](#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<T> && [equality_comparable](#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<U> && [comparison-common-type-with](concept.comparisoncommontype#concept:comparison-common-type-with "18.5.3Comparison common types[concept.comparisoncommontype]")<T, U> && [equality_comparable](#concept:equality_comparable "18.5.4Concept equality_­comparable[concept.equalitycomparable]")< common_reference_t< const remove_reference_t<T>&, const remove_reference_t<U>&>> && [weakly-equality-comparable-with](#concept:weakly-equality-comparable-with "18.5.4Concept equality_­comparable[concept.equalitycomparable]")<T, U>;

4

#

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&, const remove_reference_t&>T and U modelequality_comparable_with<T, U> only ifbool(t == u) == bool(CONVERT_TO_LVALUE(t2) == CONVERT_TO_LVALUE(u2))