C++20의 operator<=>는 비교 결과로 세 가지 정렬 관계 타입을 반환할 수 있음. 각각의 특징은 아래와 같음.

1. strong_ordering

  • 완전한 정렬(Strict Total Order)
  • Equality(동일성) 기준: 값이 완전히 같아야 같다고 판단
  • a == ba <=> 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 == ba 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