compare_partial_ordering (부분 순서 비교)
std::partial_ordering는 C++20에서 도입된 삼자 비교(three-way comparison)의 결과 타입이에요. 이 타입은 여섯 가지 비교 연산자를 모두 지원하면서도, 대체 가능성을 보장하지 않아요. 또한 비교 불가능한 값도 허용해서, a < b, a == b, a > b가 모두 거짓일 수 있어요.
출처: cppreference
본문
개요
std::partial_ordering 클래스 타입은 다음과 같은 특성을 가진 삼자 비교의 결과 타입이에요.
- 여섯 가지 관계 연산자(==, !=, <, <=, >, >=)를 모두 지원해요.
- 대체 가능성(substitutability)을 의미하지 않아요. 즉, a가 b와 동등하더라도 f(a)와 f(b)가 동등하지 않을 수 있어요. 여기서 f는 인자의 public const 멤버를 통해 접근 가능한 비교에 중요한 상태만 읽는 함수를 뜻해요. 다시 말해, 동등한 값이라도 구별될 수 있어요.
- 비교 불가능한 값을 허용해요. a < b, a == b, a > b가 모두 거짓일 수 있어요.
상수 (Constants)
std::partial_ordering 타입은 네 가지 유효한 값을 가지며, 이 값들은 타입의 const static 데이터 멤버로 구현돼 있어요.
| 이름 |
정의 |
| less [static] |
작음(앞에 정렬됨) 관계를 나타내는 유효한 값 (public static 멤버 상수) |
| equivalent [static] |
동등함(앞이나 뒤에 정렬되지 않음)을 나타내는 유효한 값 (public static 멤버 상수) |
| greater [static] |
큼(뒤에 정렬됨) 관계를 나타내는 유효한 값 (public static 멤버 상수) |
| unordered [static] |
비교 불가능한 값과의 관계를 나타내는 유효한 값 (public static 멤버 상수) |
변환 (Conversions)
std::partial_ordering는 다른 비교 카테고리 타입으로 암시적으로 변환될 수 없어요. 반면에 std::strong_ordering와 std::weak_ordering는 모두 partial_ordering로 암시적으로 변환될 수 있어요.
비교 (Comparisons)
이 타입의 값과 리터럴 0 사이에는 비교 연산자가 정의돼 있어요. 이는 a <=> b == 0 또는 a <=> b < 0 같은 표현식을 지원해서, 삼자 비교 연산자의 결과를 불리언 관계로 변환하는 데 사용할 수 있어요. std::is_eq, std::is_lt 등을 참고하세요.
이 함수들은 일반적인 비한정 탐색이나 한정 탐색에서는 보이지 않으며, std::partial_ordering가 인자의 연관된 클래스(associated class)일 때 인자 의존적 탐색(argument-dependent lookup)으로만 찾을 수 있어요.
partial_ordering를 정수 리터럴 0 이외의 다른 값과 비교하려는 프로그램의 동작은 정의되지 않아요.
| operator== operator< operator> operator<= operator>= operator<=> |
0 또는 partial_ordering와 비교 (함수) |
operator==
| friend constexpr bool operator == ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr bool operator == ( partial_ordering v , partial_ordering w ) noexcept = default ; |
(2) |
|
매개변수
| v, w |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
operator<
| friend constexpr bool operator < ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr bool operator < ( /unspecified/ u , partial_ordering v ) noexcept ; |
(2) |
|
매개변수
| v |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
operator<=
| friend constexpr bool operator <= ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr bool operator <= ( /unspecified/ u , partial_ordering v ) noexcept ; |
(2) |
|
매개변수
| v |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
operator>
| friend constexpr bool operator > ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr bool operator > ( /unspecified/ u , partial_ordering v ) noexcept ; |
(2) |
|
매개변수
| v |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
operator>=
| friend constexpr bool operator >= ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr bool operator >= ( /unspecified/ u , partial_ordering v ) noexcept ; |
(2) |
|
매개변수
| v |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
operator<=>
| friend constexpr partial_ordering operator <=> ( partial_ordering v , /unspecified/ u ) noexcept ; |
(1) |
|
| friend constexpr partial_ordering operator <=> ( /unspecified/ u , partial_ordering v ) noexcept ; |
(2) |
|
매개변수
| v |
- |
확인할 std::partial_ordering 값 |
| u |
- |
리터럴 0 인자를 받아들이는 모든 타입의 사용되지 않는 매개변수 |
반환값
참고 (Notes)
부동소수점 값 사이의 내장 operator<=>는 이 순서를 사용해요. 양의 영과 음의 영은 동등하게 비교되지만 구별될 수 있고, NaN 값은 다른 어떤 값과도 비교 불가능(unordered)하게 비교돼요.
예제 (Example)
같이 보기 (See also)
| strong_ordering (C++20) |
6개 연산자를 모두 지원하고 대체 가능한 삼자 비교의 결과 타입 (클래스) [edit] |
| weak_ordering (C++20) |
6개 연산자를 모두 지원하고 대체 가능하지 않은 삼자 비교의 결과 타입 (클래스) [edit] |
더 알아보기 (Learn more)
cppreference