On this page
article
Ordering: strong / weak / partial
C++20의 operator<=>
는 비교 결과로 세 가지 정렬 관계 타입을 반환할 수 있음. 각각의 특징은 아래와 같음.
1. strong_ordering
- 완전한 정렬(Strict Total Order)
- Equality(동일성) 기준: 값이 완전히 같아야 같다고 판단
a == b
⇔a <=> b == 0
- 예: 정수, 주소값, 값 기반 비교
특징
a <=> b
의 결과가std::strong_ordering
이면 다음과 같은 동작이 가능:
if ((a <=> b) == 0) // a == b
if ((a <=> b) < 0) // a < b
if ((a <=> b) > 0) // a > b
strong_ordering
은 암시적으로weak_ordering
으로 변환 가능
2. weak_ordering
- 비교 가능하지만 완전한 동일성은 보장하지 않음
- Equivalent(등가성) 기준: 적당히 같은 것으로 간주
- 예: 대소문자 구분 없는 문자열 비교, 정렬 시 중복 허용
특징
a == b
와a is equivalent to b
는 다름a <=> b == 0
일 때 a와 b가 equivalent하다는 의미일 뿐, 반드시 같은 객체나 값일 필요는 없음
3. partial_ordering
- NaN, 예외 값 등으로 인해 비교가 정의되지 않는 경우 처리
- 결과는
<
,==
,>
, 또는 unordered 중 하나가 될 수 있음
예제: 실수 비교에서 NaN 처리
#include <compare>
#include <cmath>
int main() {
double a = std::nan(""), b = 1.0;
auto result = a <=> b;
if (result == std::partial_ordering::unordered) {
std::cout << "비교 불가 (NaN)\n";
}
}
특징
result < 0
,> 0
,== 0
모두 해당되지 않는 경우:unordered
- 실수 연산에서 발생 가능 (IEEE 754 기준에 따른 NaN 비교 등)
구현 시 <=>가 반환하는 ordering 타입은?
operator<=>
는 다음 기준에 따라 strong/weak/partial 중 하나를 반환함.
자동 구현 (= default
)인 경우
- 모든 멤버가 strong_ordering 지원 →
strong_ordering
- 일부가 weak_ordering만 지원 →
weak_ordering
- 실수형(double 등) 포함 →
partial_ordering