std::equality_comparable, std::equality_comparable_with
| 헤더 <concepts>
|
||
template< class T >
concept equality_comparable = __WeaklyEqualityComparableWith<T, T>;
|
(1) | (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>;
|
(2) | (C++20 이후) |
| 도우미 개념 |
||
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;
};
|
(3) | (설명 전용*) |
template< class T, class U >
concept __ComparisonCommonTypeWith =
std::common_reference_with<
const std::remove_reference_t<T>&,
const std::remove_reference_t<U>&>;
|
(4) | (C++23까지) (설명 전용*) |
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&>;
};
template< class T, class U >
concept __ComparisonCommonTypeWith =
_ComparisonCommonTypeWithImpl<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;
|
(C++23 이후) (설명 전용*) |
|
std::equality_comparable은(는) ==와(과) != 비교 연산자가 T에 대해 동등성을 반영함을 지정합니다. 즉, 피연산자가 같을 때에만 ==가 true를 산출합니다.std::equality_comparable_with은(는) (서로 다른 유형이 가능한) ==와(과) != 비교 연산자가 T 및 U 피연산자에 대해 동등성과 일관된 결과를 산출함을 지정합니다. 혼합된 피연산자를 비교하면 해당 피연산자를 공통 유형으로 변환한 결과와 동등합니다.__WeaklyEqualityComparableWith은(는) T 유형의 객체와 U 유형의 객체가 == 및 !=을(를) 사용하여 서로 비교될 수 있고(어느 순서든) 비교 결과가 일관됨을 지정합니다.__ComparisonCommonTypeWith은(는) 두 유형이 공통 유형을 공유하며, 각 유형의 const lvalue 또는 non-const rvalue(C++23 이후)가 해당 공통 유형으로 변환 가능함을 지정합니다.의미론적 요구사항
이러한 개념들은 해당 개념이 충족되고 그들이 포함하는 모든 개념이 모델링된 경우에만 모델링됩니다.
다음 단락들에서, 표현식
E
와 타입
C
가 주어졌을 때,
CONVERT_TO
<
C
>
(
E
)
는 다음과 같이 정의됩니다:
|
(C++23 이전) |
|
(C++23 이후) |
T
의 객체
a
와
b
가 주어졌을 때,
bool
(
a
==
b
)
가
true
인 경우는 오직
a
와
b
가 동일할 때만입니다.
a
==
b
가
equality-preserving
이어야 한다는 요구사항과 함께, 이는
==
가 대칭적이고 추이적임을 의미하며, 더 나아가 적어도 하나의 다른 객체와 동일한 모든 객체
a
에 대해
==
가 반사적임을 의미합니다.
-
t와t2가 각각 const std:: remove_reference_t < T > 및 std:: remove_cvref_t < T > 타입의 서로 다른 동등한 객체를 참조하는 lvalue이고, -
u와u2가 각각 const std:: remove_reference_t < U > 및 std:: remove_cvref_t < U > 타입의 서로 다른 동등한 객체를 참조하는 lvalue이며, -
C가 std:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > 인 경우,
다음 표현식이 참이어야 합니다:
- bool ( t == u ) == bool ( CONVERT_TO < C > ( t2 ) == CONVERT_TO < C > ( u2 ) ) .
-
t, const std:: remove_reference_t < T > 타입의 lvalue 및 -
u, const std:: remove_reference_t < U > 타입의 lvalue가 주어졌을 때,
다음 조건들이 참이어야 합니다:
- t == u , u == t , t ! = u , u ! = t 가 동일한 정의역을 가짐;
- bool ( u == t ) == bool ( t == u ) ;
- bool ( t ! = u ) == ! bool ( t == u ) ; 그리고
- bool ( u ! = t ) == bool ( t ! = u ) .
|
해당하는
|
(C++23 이전) |
|
다음을 가정할 때:
다음 조건들이 성립해야 합니다:
|
(C++23 이후) |
동등성 보존
표준 라이브러리 개념의 requires expressions 에 선언된 표현식들은 equality-preserving 해야 합니다(다르게 명시된 경우를 제외하고).
암시적 표현 변형
상수 lvalue 피연산자에 대해 비수정적인 표현식을 사용하는 requires expression 는 implicit expression variations 도 요구합니다.
참고문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
-
18.5.4 개념
equality_comparable[concept.equalitycomparable]
-
18.5.4 개념
- C++20 표준(ISO/IEC 14882:2020):
-
-
18.5.3 개념
equality_comparable[concept.equalitycomparable]
-
18.5.3 개념