!= 在 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);
};
如果您只声明 ==
运算符,您将自动生成 !=
,如果您同时提供 <
和 ==
,所有运算符都将是定义:)
这是 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);
};
如果您只声明 ==
运算符,您将自动生成 !=
,如果您同时提供 <
和 ==
,所有运算符都将是定义:)