可以在 C++20 中的 class 定义之外默认比较运算符吗?

Can comparison operator be defaulted outside of class definition in C++20?

从C++20开始,编译器可以通过operator ==() = default语法为用户classes自动生成比较运算符。但是这个运算符必须仅在 class 定义内默认还是可以在 class 定义之后?

考虑程序:

struct A { friend bool operator==(A,A); };
bool operator==(A,A) = default;

它被 GCC 接受,但被 Clang 拒绝并出现错误:

error: equality comparison operator can only be defaulted in a class definition

演示:https://gcc.godbolt.org/z/KboK7frhb

这里是哪个编译器?

将运算符定义放在 class 定义之外对于仅在一个翻译单元中使用运算符可能很有用,例如,从而缩短大程序的编译时间。

P2085R0 removed the requirement on the defaulted comparison operator to be defaulted on the first declaration. Clang currently doesn't support this proposal:

另见 https://reviews.llvm.org/D103929