!= 在 C++20 中从 == 自动生成?

!= auto generated from == in C++20?

这是 C++20 中的标准行为吗?我在 cppreference 中找不到任何相关信息。

我刚刚在 Clang 和 Visual Studio 上都试过了,它有效,并且没有给我任何类型的错误或警告。我还检查了调试器,看看 operator== 是否被调用了,它确实被调用了! C++20 现在是否允许在存在 operator== 时自动生成 operator!=?它默认为正常的 !(a == b) 吗?如果是这样,那对 C++ 来说太棒了!

!= auto generated from == in C++20?

Is this standard behavior in C++20?

是的。 operator!= 是从 C++20 中的 operator== 自动生成的。

此外,如果您定义 operator<=>,则会生成所有四个关系运算符,如果您将 operator<=> 定义为默认值,则会生成所有比较运算符。

大多数情况下您想做的事情:

struct example
{
    std::string a;
    int         b;

    auto operator<=>(const example&) const = default;
};

在旧的 C++ 版本中你可以做的是使用 CRTP(Curriously Recuring Template principle)。

思路是有一个模板base,模板参数是Derived class :

template <typename Derived>
class Comparable {
  public:
    friend constexpr auto operator!=(const Derived &a, const Derived &b) noexcept { return !(a == b); }

    friend constexpr auto operator<=(const Derived &a, const Derived &b) noexcept { return !(b < a); }

    friend constexpr auto operator>(const Derived &a, const Derived &b) noexcept { return b < a; }

    friend constexpr auto operator>=(const Derived &a, const Derived &b) noexcept { return !(a < b); }
};

因此,您可以像这样使用它:

struct Example : Comparable<Example> {
    friend bool operator==(const Example &a, const Example &b);
    friend bool operator<(const Example &a, const Example &b);
};

如果您只声明 == 运算符,您将自动生成 !=,如果您同时提供 <==,所有运算符都将是定义:)