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 표준 도구예요.