c++20에는 새로된 연산자 <=> (three-way comparison operator)가 추가되었습니다.

이 연산자의 의미는 다음과 같습니다.

의미
(a <=> b) < 0 a < b
(a <=> b) > 0 a > b
(a <=> b) == 0 a == b

예제

#include <compare>

int a = 10, b = 20;
bool r1 = a < b;
auto r2 = a <=> b;

if (r2 > 0) std::cout << "a > b" << std::endl;
else if (r2 < 0) std::cout << "a < b" << std::endl;
else if (r2 == 0) std::cout << "a == b" << std::endl;

std::cout << typeid(r2).name() << std::endl; //std::string_ordering

어디에 쓰나?

  • 사용자 타입을 만든 후 기존 타입과의 비교 operatior 연산자를 오버라이딩 할 때 <=> 를 활용 할 경우 기존 18개 -> 3개 구현으로 코드양이 많이 줄어듭니다.

<=> 연산자의 반환 타입

  • std::strong_ordering : 두 비교 대상이 같다.
  • std::weak_ordering : 두 비교 대상이 대등하다.(완벽하게 같진 않을 수 있음)
  • std::partial_ordering : 비교를 없는 등의 경우의 의미를 나타내기 위해 사용 ( 실수 계산시 NaN 케이스 등 )
#include <compare>

int n1 = 10, n2 = 20;
double d1 = 10, d2 = 20;
auto r1 = n1 <=> n2;
auto r2 = d1 <=> d2;
auto r3 = n1 <=> d2;

if (r1 < 0 ){} // r1 == std::strong_ordering::less
if (r2 > 0 ){} // r1 == std::strong_ordering::greater
if (r3 == 0 ){} // r1 == std::strong_ordering::equal

std::cout << typeid(r1).name() << std::endl; // struct std::strong_ordering
std::cout << typeid(r2).name() << std::endl; // struct std::partial_ordering
std::cout << typeid(r3).name() << std::endl; // struct std::partial_ordering

추가 정보

<=> 연산자는 Rewrite Expression라는 개념을 사용하며 의미는 사용자가 만든 표현식을 컴파일러가 컴파일 시간에 다시 작성한다는 의미입니다.

더 많은 C++20 관련 정보