compare_weak_order
compare_weak_order (약한 순서 비교)
std::weak_order는 C++20에서 도입된 사용자 지정 지점 객체로, 두 값을 3방향 비교하여 std::weak_ordering 타입의 결과를 생성해요. 이 함수는 부동소수점 값의 NaN을 포함한 모든 값에 대해 일관된 약한 순서를 제공해요. 일반적인 비교 연산자나 operator<=>가 없는 타입에서도 동작할 수 있도록 설계되었어요.
출처: cppreference
본문
정의
<compare> 헤더에 정의됨 |
||
|---|---|---|
inline namespace /* unspecified */ { inline constexpr /* unspecified */ weak_order = /* unspecified */ ; } |
(C++20부터) | |
| 호출 시그니처 | ||
template < class T , class U > requires /* see below */ constexpr std :: weak_ordering weak_order ( T && t , U && u ) noexcept ( /* see below */ ); |
설명
3방향 비교를 사용하여 두 값을 비교하고 std::weak_ordering 타입의 결과를 생성해요.
t와 u를 표현식이라고 하고, T와 U가 각각 decltype((t))와 decltype((u))를 나타낸다고 할 때, std::weak_order(t, u)는 다음 표현식과 동등해요(expression-equivalent):
std::is_same_v<std::decay_t<T>, std::decay_t<U>>가 참이라면:std::weak_ordering(weak_order(t, u))—std::weak_order의 선언을 포함하지 않는 문맥에서 오버로드 해석을 수행했을 때 잘 구성된 표현식이라면,- 그렇지 않고
T가 부동소수점 타입이라면:std::numeric_limits<T>::is_iec559가 참이면, 부동소수점 값의 약한 순서 비교를 수행하고(아래 참조) 그 결과를std::weak_ordering타입의 값으로 반환해요.- 그렇지 않으면,
T의 비교 연산자에서 관찰되는 순서와 일치하는std::weak_ordering타입의 값을 생성해요.
- 그렇지 않고
std::weak_ordering(std::compare_three_way()(t, u))가 잘 구성되었다면 그것을 사용해요. - 그렇지 않고
std::weak_ordering(std::strong_order(t, u))가 잘 구성되었다면 그것을 사용해요.
- 그 외의 모든 경우에는 표현식이 잘 구성되지 않으며, 템플릿 인스턴스화의 즉시 문맥에서 나타나면 치환 실패(substitution failure)를 일으킬 수 있어요.
사용자 지정 지점 객체
std::weak_order라는 이름은 사용자 지정 지점 객체(customization point object)를 나타내며, 이는 리터럴 세미레귤러 클래스 타입의 const 함수 객체예요. 자세한 내용은 CustomizationPointObject를 참고하세요.
IEEE 부동소수점 타입의 엄격한 약순서
x와 y를 동일한 IEEE 부동소수점 타입의 값이라고 하고, weak_order_less(x, y)는 C++ 표준에 정의된 엄격한 약순서에서 x가 y보다 앞서는지를 나타내는 불리언 결과라고 해요.
x와y모두 NaN이 아니라면,weak_order_less(x, y) == true는 오직x < y일 때만 성립해요. 즉, 동일한 부동소수점 값을 나타내는 모든 표현은 동등해요.x가 음의 NaN이고y가 음의 NaN이 아니라면,weak_order_less(x, y) == true예요.x가 양의 NaN이 아니고y가 양의 NaN이라면,weak_order_less(x, y) == true예요.x와y가 같은 부호의 NaN이라면,(weak_order_less(x, y) || weak_order_less(y, x)) == false예요. 즉, 같은 부호의 모든 NaN은 동등해요.
예제
| 이 섹션은 불완전해요. 이유: 예제 없음 |
|---|
같이 보기
weak_ordering (C++20) |
6개의 모든 연산자를 지원하고 대체 불가능한 3방향 비교의 결과 타입 (클래스) [편집] |
|---|---|
strong_order (C++20) |
3방향 비교를 수행하고 std::strong_ordering 타입의 결과를 생성해요 (사용자 지정 지점 객체) [편집] |
partial_order (C++20) |
3방향 비교를 수행하고 std::partial_ordering 타입의 결과를 생성해요 (사용자 지정 지점 객체) [편집] |
compare_weak_order_fallback (C++20) |
operator<=>를 사용할 수 없더라도 3방향 비교를 수행하고 std::weak_ordering 타입의 결과를 생성해요 (사용자 지정 지점 객체) [편집] |