The Spaceship Operator and Its Impact on Equality Operators
The spaceship operator <=>, introduced in C 20, provides a concise syntax for three-way comparisons. However, users encountering unexpected behavior when using both the spaceship operator and equality operators (== and !=) may be surprised.
Default Implementation and Generated Equality Operators
When the spaceship operator is declared as defaulted (e.g., auto operator<=>(const X&) const = default;), it enables the compiler to automatically generate an == operator based on the underlying comparison. This is demonstrated in the following example:
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; }; int main() { X a, b; a == b; // OK! }
Custom Implementation and Non-Generated Equality Operators
However, when a custom implementation of the spaceship operator is provided, the generated equality operators are no longer available. This was observed in the question content, where a custom operator<=> implementation resulted in an error when using the == operator.
Reasoning Behind the Behavior
This behavior is intentional. The C standard specifies that only a defaulted spaceship operator triggers the generation of an equality operator ([class.compare.default](https://eel.is/c draft/class.compare.default)). The rationale is that certain classes, such as std::vector, may not want to use the spaceship operator for equality checks as it may not be the most efficient approach.
Conclusion
Thus, when defining a custom spaceship operator, it is important to keep in mind that it eliminates the automatic generation of equality operators. If equality checks are required, it is recommended to provide an explicit definition for the == operator.
The above is the detailed content of Does Using a Custom Spaceship Operator Prevent the Generation of Equality Operators in C ?. For more information, please follow other related articles on the PHP Chinese website!