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

Fed*_*dor 15 c++ comparison-operators language-lawyer c++20

从C++20开始,编译器可以通过operator ==() = default语法的方式自动生成用户类的比较运算符。但是这个运算符必须只能在类定义内部默认吗?还是也可以在类定义之后?

考虑该程序:

struct A { friend bool operator==(A,A); };
bool operator==(A,A) = default;
Run Code Online (Sandbox Code Playgroud)

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

error: equality comparison operator can only be defaulted in a class definition
Run Code Online (Sandbox Code Playgroud)

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

这里是哪个编译器?

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

Lan*_*yer 15

P2085R0删除了在第一个声明中默认比较运算符的要求。Clang 目前不支持此提案:https://clang.llvm.org/cxx_status.html

另请参阅https://reviews.llvm.org/D103929