There's a new comparison operator <=>
in C++20. However I think in most cases a simple subtraction works well:
int my_strcmp(const char *a, const char *b) {
while (*a == *b && *a != 0 && *b != 0) {
a++, b++;
}
// Version 1
return *a - *b;
// Version 2
return *a <=> *b;
// Version 3
return ((*a > *b) - (*a < *b));
}
They have the same effect. I can't really understand the difference.
The operator solves the problem with numeric overflow that you get with subtraction: if you subtract a large positive number from a negative that is close to INT_MIN
, you get a number that cannot be represented as an int
, thus causing undefined behavior.
Although version 3 is free from this problem, it utterly lacks readability: it would take some time to understand by someone who has never seen this trick before. <=>
operator fixes the readability problem, too.
This is only one problem addressed by the new operator. Section 2.2.3 of Herb Sutter's Consistent comparison paper talks about the use of <=>
with other data types of the language where subtraction may produce inconsistent results.