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 타입의 결과를 생성해요.

tu를 표현식이라고 하고, TU가 각각 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 부동소수점 타입의 엄격한 약순서

xy를 동일한 IEEE 부동소수점 타입의 값이라고 하고, weak_order_less(x, y)는 C++ 표준에 정의된 엄격한 약순서에서 xy보다 앞서는지를 나타내는 불리언 결과라고 해요.

  • xy 모두 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예요.
  • xy가 같은 부호의 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 타입의 결과를 생성해요 (사용자 지정 지점 객체) [편집]

더 알아보기 (Learn more)

cppreference