c++20默认的比较运算符是一个非常方便的功能。但我发现如果该类有一个空的基类,它就没那么有用了。
默认运算符 <=> 通过连续比较 T 的基类(从左到右深度优先)和非静态成员(按声明顺序)子对象来计算 <=> 来执行字典比较,递归扩展数组成员(在下标递增的顺序),并在发现不相等的结果时提前停止
根据标准,SComparable如果没有运算符<=>,则不base会有运算符<=>。在我看来,为空类定义比较运算符是没有意义的。因此,默认的比较运算符不适用于具有空基类的类。
struct base {};
struct SComparable: base {
int m_n;
auto operator<=>(SComparable const&) const& = default; // default deleted, clang gives a warning
};
struct SNotComparable: base {
int m_n;
};
Run Code Online (Sandbox Code Playgroud)
如果我们迫切需要使用默认比较运算符,因此为空基类定义比较运算符base。另一个派生类SNotComparable由于其空基类而错误地变得具有可比性base。
struct base {
auto operator<=>(base const&) const& = default;
};
struct SComparable: base {
int m_n;
auto operator<=>(SComparable const&) const& = default;
};
struct SNotComparable: base { // SNotComparable is …Run Code Online (Sandbox Code Playgroud)