compare_partial_ordering

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