https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200
--- Comment #5 from Patrick Palka <ppalka at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #2) > If one defines instead say bool operator<(const foo, const foo); > then the built-in candidate isn't considered because of > https://eel.is/c++draft/over.match.oper#3.3 > But for the user operator<=> vs. built-in operator<, they don't have the > same operator name, so the built-in operator< is in the candidate set. I came to the same conclusion but for a different reason. According to p3.3.4 only a "non-member candidate" can prevent a built-in candidate from being considered. And according to p3.2 and p3.4, a user operator<=> is a "rewritten candidate" not a "non-member candidate", and therefore a user operator<=> can't prevent a built-in candidate from being considered (even if their parameter-type-lists are the same).