Safe Integer Comparisons C++20

From C++ Weekly - Ep 284

1. Requirements

Required C++20

2. Problem

Never compare two values from different types.

#include <iostream>

int getval() { return -1; };
unsigned int getval2() { return 1; };

int
main(int argc, char *argv[])
{
	std::cout << getval() << " < " << getval2()
			  << " = " << std::boolalpha << (getval() < getval2()) << std::endl;
	return 0;
}

Output:

-1 < 1 = false

No default warning

Due to -1 being 1111…111 in C2 and 1 just 0000…1

3. Solution

C++20

#include <iostream>
#include <utility> // <--

int getval() { return -1; };
unsigned int getval2() { return 1; };

int
main(int argc, char *argv[])
{
	std::cout << getval() << " < " << getval2()
			  << " = " << std::boolalpha << std::cmp_less(getval(), getval2()) << std::endl;

	return 0;
}

Output:

-1 < 1 = true