Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/concepts/equality comparable"

From cppreference.com
< cpp‎ | concepts
m (satisified -> satisfied)
m (Space added: t != u,u != t -> t != u, u != t)
Line 51: Line 51:
 
* {{tt|u}}, an lvalue of type {{c|const std::remove_reference_t<U>}},
 
* {{tt|u}}, an lvalue of type {{c|const std::remove_reference_t<U>}},
 
the following are true:
 
the following are true:
* {{c|1=t == u}}, {{c|1=u == t}}, {{c|1=t != u}},{{c|1=u != t}} have the same domain;
+
* {{c|1=t == u}}, {{c|1=u == t}}, {{c|1=t != u}}, {{c|1=u != t}} have the same domain;
 
* {{c|1=bool(u == t) == bool(t == u)}};
 
* {{c|1=bool(u == t) == bool(t == u)}};
 
* {{c|1=bool(t != u) == !bool(t == u)}}; and
 
* {{c|1=bool(t != u) == !bool(t == u)}}; and

Revision as of 07:45, 6 February 2023

Defined in header <concepts>
template < class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
(1) (since C++20)
template <class T, class U>

concept equality_comparable_with =
  std::equality_comparable<T> &&
  std::equality_comparable<U> &&
  std::common_reference_with<
    const std::remove_reference_t<T>&,
    const std::remove_reference_t<U>&> &&
  std::equality_comparable<
    std::common_reference_t<
      const std::remove_reference_t<T>&,
      const std::remove_reference_t<U>&>> &&

  __WeaklyEqualityComparableWith<T, U>;
(2) (since C++20)
template<class T, class U>

concept __WeaklyEqualityComparableWith = // exposition only
  requires(const std::remove_reference_t<T>& t,
           const std::remove_reference_t<U>& u) {
    { t == u } -> boolean-testable;
    { t != u } -> boolean-testable;
    { u == t } -> boolean-testable;
    { u != t } -> boolean-testable;

  };
(3) (since C++20)
1) The concept std::equality_comparable specifies that the comparison operators == and != on T reflects equality: == yields true if and only if the operands are equal.
2) The concept std::equality_comparable_with specifies that the comparison operators == and != on (possibly mixed) T and U operands yield results consistent with equality. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type.
3) The exposition-only concept __WeaklyEqualityComparableWith specifies that an object of type T and an object of type U can be compared for equality with each other (in either order) using both == and !=, and the results of the comparisons are consistent.

Semantic requirements

These concepts are modeled only if they are satisfied and all concepts they subsume are modeled.

1) std::equality_comparable<T> is modeled only if, given objects a and b of type T, bool(a == b) is true if and only if a and b are equal. Together with the requirement that a == b is equality preserving, this implies that == is symmetric and transitive, and further that == is reflexive for all objects a that are equal to at least one other object.
2) std::equality_comparable_with<T, U> is modeled only if, given any lvalue t of type const std::remove_reference_t<T> and any lvalue u of type const std::remove_reference_t<U>, and let C be std::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>, bool(t == u) == bool(C(t) == C(u)).
3) __WeaklyEqualityComparableWith<T, U> is modeled only if given

the following are true:

  • t == u, u == t, t != u, u != t have the same domain;
  • bool(u == t) == bool(t == u);
  • bool(t != u) == !bool(t == u); and
  • bool(u != t) == bool(t != u).

Equality preservation

Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).

Implicit expression variations

A requires expression that uses an expression that is non-modifying for some constant lvalue operand also requires implicit expression variations.