Namespaces
Variants

std::compare_weak_order_fallback

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐지됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
교환 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
헤더 <compare>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */
        compare_weak_order_fallback = /* unspecified */;
}
에 정의됨 (C++20부터)
호출 시그니처
template< class T, class U >
    requires /* see below */
constexpr std::weak_ordering
    compare_weak_order_fallback( T&& t, U&& u ) noexcept(/* see below */);
(C++20부터)

하위 표현식 t과 u에 대해 삼진 비교를 수행하여 std::weak_ordering 타입의 결과를 생성합니다. 연산자 <=>을 사용할 수 없는 경우에도 마찬가지입니다.

std::decay_t<T>과 std::decay_t<U>이 같은 타입인 경우, std::compare_weak_order_fallback(t, u)은(는) 다음에 대해 표현식-동등합니다:

  • std::weak_order(t, u), 올바른 형식의 표현식인 경우; 그렇지 않으면,
  • t == u ? std::weak_ordering::equivalent :
    t < u ? std::weak_ordering::less :
             std::weak_ordering::greater
    , 표현식 t == u과 t < u이 모두 올바른 형식이고 decltype(t == u)과 decltype(t < u)이 각각 부울-테스트 가능을 모델링하는 경우. 단, t과 u은 한 번만 평가됩니다.

다른 모든 경우에 std::compare_weak_order_fallback(t, u)은(는) 올바른 형식이 아니며, 템플릿 인스턴스화의 즉시 문맥에 나타날 때 치환 실패가 발생할 수 있습니다.

커스터마이제이션 포인트 객체

이름 std::compare_weak_order_fallback 는 사용자 정의 지점 객체 를 나타내며, 이는 리터럴 함수 객체 의 const 리터럴 semiregular 클래스 타입입니다. 자세한 내용은 CustomizationPointObject 를 참조하십시오.

예제

#include <compare>
#include <iostream>
// <=>를 지원하지 않음
struct Rational_1
{
    int num;
    int den; // > 0
};
inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den < rhs.num * lhs.den;
}
inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs)
{
    return lhs.num * rhs.den == rhs.num * lhs.den;
}
// <=>를 지원함
struct Rational_2
{
    int num;
    int den; // > 0
};
inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
inline constexpr bool operator==(Rational_2 lhs, Rational_2 rhs)
{
    return lhs <=> rhs == 0;
}
void print(int id, std::weak_ordering value)
{
    std::cout << id << ") ";
    if (value == 0)
        std::cout << "equal\n";
    else if (value < 0)
        std::cout << "less\n";
    else
        std::cout << "greater\n";
}
int main()
{
    Rational_1 a{1, 2}, b{3, 4};
//  print(0, a <=> b); // 작동하지 않음
    print(1, std::compare_weak_order_fallback(a, b)); // 작동함, <와 ==로 기본 설정됨
    Rational_2 c{6, 5}, d{8, 7};
    print(2, c <=> d); // 작동함
    print(3, std::compare_weak_order_fallback(c, d)); // 작동함
    Rational_2 e{2, 3}, f{4, 6};
    print(4, e <=> f); // 작동함
    print(5, std::compare_weak_order_fallback(e, f)); // 작동함
}

출력:

1) less
2) greater
3) greater
4) equal
5) equal

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2114
( P2167R3 )
C++20 폴백 메커니즘이 반환 타입이
bool 로 변환 가능하기만을 요구함
제약 조건이 강화됨

참고 항목

(C++20)
3방향 비교를 수행하고 std::weak_ordering 타입의 결과를 생성함
(커스터마이제이션 포인트 객체)