How is the three-way comparison operator different from subtraction?
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.
Here are some cases that subtraction won't work for:
-
unsigned
types. - Operands that cause integer overflow.
- User-defined types that don't define
operator -
(perhaps because it's not meaningful - one may define an order without defining a notion of distance).
I suspect this list is non-exhaustive.
Of course, one can come up with workarounds for at least #1 and #2. But the intent of operator <=>
is to encapsulate that ugliness.