https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96489
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- I believe the rationale for this is that if your <=> can't be defaulted, then it must be doing something special, and synthesizing == from it is not necessarily safe. If <=> is defaulted, then it does the "obvious" thing and so synthesizing == to do the obvious thing is probably OK. If <=> is user-provided but you know that an implicitly-defined operator== would do the right thing, define operator== as defaulted. Clang agrees with GCC FWIW.