intcmp — 정수 비교 함수

intcmp — 정수 비교 함수 (cmp_equal 등)

std::cmp_equal, std::cmp_not_equal, std::cmp_less, std::cmp_greater, std::cmp_less_equal, std::cmp_greater_equal부호 있는/부호 없는 정수 간의 안전한 비교를 수행하는 함수들이에요. C++20에서 도입됐어요. <utility> 헤더에 있어요.

일반 비교(<, >)는 부호 없는 타입으로의 암묵적 변환 때문에 오답이 나올 수 있는데, 이 함수들이 이를 방지해요.

출처: cppreference

본문

// <utility> 헤더, C++20
template< class T, class U >
constexpr bool cmp_equal( T t, U u ) noexcept;
template< class T, class U >
constexpr bool cmp_less( T t, U u ) noexcept;
// cmp_not_equal, cmp_greater, cmp_less_equal, cmp_greater_equal ...

왜 필요한가 — 흔한 함정

#include <utility>

// 오답의 예: unsigned 변환
int i = -1;
unsigned int u = 1;
bool wrong = (i < u);      // i가 unsigned로 변환 → false (잘못된 결과!)

// 올바른 비교
bool correct = std::cmp_less(i, u);   // true (-1 < 1)

사용 예

int n = -5;
std::size_t sz = 3;

std::cmp_less(n, sz);          // true
std::cmp_less_equal(n, sz);    // true
std::cmp_greater(sz, n);       // true
std::cmp_equal(n, -5l);        // true (부호가 달라도 값 비교)

특징

  • 부호 있는/부호 없는 혼합 비교에서 부호를 올바르게 처리해요.
  • 모든 인자는 정수 타입이어야 해요 (아니면 ill-formed).
  • constexpr, noexcept — 컴파일 타임에 안전 비교 가능.
static_assert(std::cmp_less(-1, 1u));   // true

std::cmp_* 함수들은 부호 있는/부호 없는 정수를 섞어 비교할 때 오답·버그를 막는 C++20 표준 도구예요.

더 알아보기 (Learn more)

cppreference