C++中无符号数和有符号数的比较永远让人提心吊胆
void foo() {
int i = -1;
unsigned j = 1;
if (i > j) {
// this branch is taken
} else {
//
}
C++20中,<utility>
增加了比较函数,处理这种情况
#include <utility>
extern int i;
extern unsigned j;
bool unsafe() {
return i < j; // 可能-1 > 1
}
bool safe() {
return std::cmp_less(i, j); // 永远安全
}
比较汇编可以发现cmp_less
之类的函数会产生额外的开销,所以如果确实有符号数不可能为负数的情况下,使用这些新函数恐怕不是好的选择
P.S. std::in_range
可以用于坚持参数是否在某类型的合法范围内