标签: default-comparisons

c++20 默认比较运算符和空基类

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)

c++ spaceship-operator c++20 default-comparisons

5
推荐指数
1
解决办法
674
查看次数