compare_strong_order
compare_strong_order (강한 순서 비교)
이 페이지에서는 C++20에서 도입된 std::strong_order 사용자 지정 지점 객체에 대해 설명해요. 이 객체는 두 값을 3방향 비교(three-way comparison)하여 std::strong_ordering 타입의 결과를 만들어 내요. 특히 부동소수점 값에 대해서는 ISO/IEC/IEEE 60559의 totalOrder 의미론을 적용해 강한 전체 순서를 제공해요.
출처: cppreference
본문
개요
std::strong_order는 두 값을 3방향 비교하여 std::strong_ordering 타입의 결과를 생성해요. t와 u를 표현식이라 하고, T와 U를 각각 decltype((t))와 decltype((u))라고 할 때, std::strong_order(t, u)는 다음 규칙에 따라 표현식-동등(expression-equivalent)해요.
std::is_same_v<std::decay_t<T>, std::decay_t<U>>가true인 경우:std::strong_ordering(strong_order(t, u))가std::strong_order의 선언을 포함하지 않는 문맥에서 오버로드 해석을 수행했을 때 잘 구성된 표현식이라면 그 결과를 사용해요.- 그렇지 않고
T가 부동소수점 타입이라면:std::numeric_limits<T>::is_iec559가true이면, ISO/IEC/IEEE 60559의totalOrder비교를 수행하고 그 결과를std::strong_ordering타입의 값으로 반환해요. 이 비교는 양의 0과 음의 0, 그리고 서로 다른 표현의 NaN을 구별할 수 있다는 점에 주의해요.- 그렇지 않으면,
T의 비교 연산자로 관찰되는 순서와 일치하는std::strong_ordering타입의 값을 생성해요.
- 그 외에는
std::strong_ordering(std::compare_three_way()(t, u))가 잘 구성된 경우 그 결과를 사용해요.
- 다른 모든 경우에는 표현식이 잘 구성되지 않으며, 템플릿 인스턴스화의 즉시 문맥에 나타나면 치환 실패(substitution failure)를 일으킬 수 있어요.
다음은 호출 시그니처를 보여주는 코드 블록이에요.
template < class T , class U >
requires /* see below */
constexpr std :: strong_ordering strong_order ( T && t , U && u ) noexcept ( /* see below */ );
사용자 지정 지점 객체 (Customization point objects)
std::strong_order라는 이름은 사용자 지정 지점 객체(customization point object)를 나타내요. 이 객체는 리터럴 준정규 타입(literal semiregular class type)의 const 함수 객체이며, 자세한 내용은 CustomizationPointObject 문서를 참고하세요.
IEEE 부동소수점 타입의 엄격한 전체 순서
x와 y가 동일한 IEEE 부동소수점 타입의 값이고, total_order_less(x, y)가 ISO/IEC/IEEE 60559의 totalOrder가 정의하는 엄격한 전체 순서에서 x가 y보다 앞서는지를 나타내는 불리언 결과라고 해요.
(total_order_less(x, y) || total_order_less(y, x)) == false는 오직 x와 y의 비트 패턴이 같을 때만 성립해요.
x와y모두 NaN이 아닌 경우:x < y이면total_order_less(x, y) == true예요.x > y이면total_order_less(x, y) == false예요.x == y일 때,x가 음의 0이고y가 양의 0이면total_order_less(x, y) == true예요.x가 0이 아니고x의 지수 필드가y의 지수 필드보다 작으면total_order_less(x, y) == (x > 0)이에요. 이는 주로 10진 부동소수점 타입에서 의미가 있어요.
x또는y중 하나가 NaN인 경우:x가 음의 NaN이고y가 음의 NaN이 아니면total_order_less(x, y) == true예요.x가 양의 NaN이 아니고y가 양의 NaN이면total_order_less(x, y) == true예요.x와y가 모두 같은 부호의 NaN이고x의 가수 필드가y의 가수 필드보다 작으면total_order_less(x, y) == !std::signbit(x)예요.
예제
| 이 섹션은 불완전해요. 이유: 예제 없음 |
|---|
같이 보기
strong_ordering (C++20) |
6개의 연산자를 모두 지원하고 치환 가능한 3방향 비교의 결과 타입 (클래스) [편집] |
|---|---|
weak_order (C++20) |
3방향 비교를 수행하고 std::weak_ordering 타입의 결과를 생성하는 사용자 지정 지점 객체 [편집] |
partial_order (C++20) |
3방향 비교를 수행하고 std::partial_ordering 타입의 결과를 생성하는 사용자 지정 지점 객체 [편집] |
compare_strong_order_fallback (C++20) |
operator<=>를 사용할 수 없더라도 3방향 비교를 수행하고 std::strong_ordering 타입의 결과를 생성하는 사용자 지정 지점 객체 [편집] |