std::equali...arable_with(3)
π std::equali...arable_with(3) π
okay so welcome to the std::equality_comparable / std::equality_comparable_with page from the C++ Standard Libary manual β yes, βLibary,β thatβs literally how the manual spells it, and Iβm not fixing it π
. The page title is std::equali...arable_with(3), and weβre about to get into some concept lore, bestie.
πΈ NAME πΈ
The name line is std::equality_comparable,std::equality_comparable_with - std::equality_comparable,std::equality_comparable_with. Iconic repetition, no notes.
β¨ Synopsis β¨
Defined in header <concepts>.
okay so here are the concept definitions, exactly as the manual gives them, with their little tags. No cap, every token matters.
- (1)
equality_comparableβ (since C++20):
template< class T >
concept equality_comparable =
__WeaklyEqualityComparableWith<T, T>;
- (2)
equality_comparable_withβ (since C++20):
template< class T, class U >
concept equality_comparable_with =
std::equality_comparable<T> &&
std::equality_comparable<U> &&
__ComparisonCommonTypeWith<T, U> &&
std::equality_comparable<
std::common_reference_t<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>> &&
__WeaklyEqualityComparableWith<T, U>;
- (3)
__WeaklyEqualityComparableWithβ (exposition only*):
template< class T, class U >
concept __WeaklyEqualityComparableWith =
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;
};
__ComparisonCommonTypeWithβ (until C++23) (exposition only*):
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
- (4)
_ComparisonCommonTypeWithImplβ (since C++23) (exposition only*):
template< class T, class U, class C =
std::common_reference_t<const T&, const U&> >
concept _ComparisonCommonTypeWithImpl =
std::same_as<std::common_reference_t<const T&, const U&>,
std::common_reference_t<const U&, const T&>> &&
requires {
requires std::convertible_to<const T&, const C&> ||
std::convertible_to<T, const C&>;
requires std::convertible_to<const U&, const C&> ||
std::convertible_to<U, const C&>;
};
__ComparisonCommonTypeWithβ (since C++23) (exposition only*):
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>,
std::remove_cvref_t<U>>;
Now the numbered explanations, bestie β this is the tea β:
- The concept
std::equality_comparablespecifies that the comparison operators==and!=onTreflect equality:==yieldstrueif and only if the operands are equal. - The concept
std::equality_comparable_withspecifies that the comparison operators==and!=on (possibly mixed)TandUoperands yield results consistent with equality. Comparing mixed operands yields results equivalent to comparing the operands converted to their common type. - The exposition-only concept
__WeaklyEqualityComparableWithspecifies that an object of typeTand an object of typeUcan be compared for equality with each other (in either order) using both==and!=, and the results of the comparisons are consistent. - The exposition-only concept
__ComparisonCommonTypeWithspecifies that two types share a common type, and aconstlvalue or a non-constrvalue (since C++23) of either type is convertible to that common type.
π Semantic requirements π
These concepts are modeled only if they are satisfied and all concepts they subsume are modeled. fr fr, thatβs the whole vibe check.
In the following paragraphs, given an expression E and a type C, CONVERT_TO<C>(E) is defined as:
static_cast<C>(std::as_const(E)).(until C++23)static_cast<const C&>(std::as_const(E))if that is a valid expression, (since C++23)static_cast<const C&>(std::move(E))otherwise.
std::equality_comparable<T>is modeled only if, given objectsaandbof typeT,bool(a == b)istrueif and only ifaandbare equal. Together with the requirement thata == bis equality-preserving, this implies that==is symmetric and transitive, and further that==is reflexive for all objectsathat are equal to at least one other object.std::equality_comparable_with<T, U>is modeled only if, lettandt2be lvalues denoting distinct equal objects of typesconst std::remove_reference_t<T>andstd::remove_cvref_t<T>respectively,uandu2be lvalues denoting distinct equal objects of typesconst std::remove_reference_t<U>andstd::remove_cvref_t<U>respectively,Cbestd::common_reference_t<const std::remove_reference_t<T>&, const std::remove_reference_t<U>&>,
the following expression is true:
bool(t == u) == bool(CONVERT_TO<C>(t2) == CONVERT_TO<C>(u2)).
__WeaklyEqualityComparableWith<T, U>is modeled only if givent, an lvalue of typeconst std::remove_reference_t<T>andu, an lvalue of typeconst std::remove_reference_t<U>,
the following are true:
t == u,u == t,t != u,u != thave the same domain;bool(u == t) == bool(t == u);bool(t != u) == !bool(t == u); andbool(u != t) == bool(t != u).
__WeaklyEqualityComparableWith<T, U>is modeled only if:- The corresponding
common_reference_withconcept is modeled. (until C++23) - Let (since C++23)
Cbestd::common_reference_t<const T&, const U&>,t1andt2be equality-preserving expressions that are lvalues of typestd::remove_cvref_t<T>,u1andu2be equality-preserving expressions that are lvalues of typestd::remove_cvref_t<U>,
- The corresponding
the following conditions hold:
CONVERT_TO<C>(t1)equalsCONVERT_TO<C>(t2)if and only ift1equalst2; andCONVERT_TO<C>(u1)equalsCONVERT_TO<C>(u2)if and only ifu1equalsu2.
π«Ά 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.
Source/version/date check, bestie: this page comes from http://cppreference.com, dated 2024.06.10, and the manual title is std::equali...arable_with(3). Thatβs the footer tea β now go compare some equal objects and slay responsibly πβ¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms