首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >!= ==在C++20中自动生成?

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

Stack Overflow用户
提问于 2020-09-29 14:10:03
回答 2查看 584关注 0票数 3

这是C++20中的标准行为吗?我在这里找不到任何关于它的东西。

我刚刚在Clang和Visual上都试过了,它可以工作,它不会给我任何错误或警告。我还与调试器检查是否正在调用operator==,它是否调用了!C++20现在允许在operator!=出现时自动生成operator==吗?它默认为一个正常的!(a == b)吗?如果是这样的话,那对C++来说就太棒了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-29 14:30:02

!=自动生成自== in C++20?这是C++20中的标准行为吗?

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

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

在大多数情况下,你想做的事情是:

代码语言:javascript
复制
struct example
{
    std::string a;
    int         b;

    auto operator<=>(const example&) const = default;
};
票数 6
EN

Stack Overflow用户

发布于 2020-09-30 17:22:50

在较早的C++版本中,您可以使用CRTP (原则)。

其思想是有一个模板库,模板参数是派生类:

代码语言:javascript
复制
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); }
};

所以,你可以这样使用它:

代码语言:javascript
复制
struct Example : Comparable<Example> {
    friend bool operator==(const Example &a, const Example &b);
    friend bool operator<(const Example &a, const Example &b);
};

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64121390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档