std::compare_weak_order_fallback
| 헤더 <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
타입의 결과를 생성함
(커스터마이제이션 포인트 객체) |