首页  >  文章  >  后端开发  >  为什么自定义 `spaceship` 运算符在 C 20 中不生成 `==` 和 `!=` 运算符?

为什么自定义 `spaceship` 运算符在 C 20 中不生成 `==` 和 `!=` 运算符?

Patricia Arquette
Patricia Arquette原创
2024-11-07 05:35:02294浏览

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

非默认运算符以及 == 和 != 的缺失

在 C 20 中,新引入的宇宙飞船运算符 () 引发了有关 == 和 != 运算符生成的一些意外行为。用户在使用具有自定义实现的非默认 spaceship 运算符时可能会遇到编译错误。

默认情况下,spaceship 运算符会比较给定类型的两个对象。如果类没有显式定义 == 运算符,但定义了默认的非默认 spaceship 运算符,则编译器将自动生成一个 == 运算符,其访问权限与 spaceship 运算符相同。这种行为在语言标准 [class.compare.default] 中指定,确保像 std::vector 这样的类不会使用非默认的太空飞船运算符进行相等性测试。

但是,如果太空飞船运算符不是默认(即,它有自定义实现),编译器将不会生成 == 运算符。这是因为定义自定义宇宙飞船运算符的类可能需要 == 的专门实现来处理特定的比较场景。因此,语言将其留给程序员在需要时显式定义 == 运算符。

例如,考虑以下代码:

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

此代码编译成功,因为太空飞船运算符是默认的,编译器生成 == 运算符。但是,如果我们将 spaceship 运算符更改为自定义实现:

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const
    {
        return Dummy <=> other.Dummy;
    }
};

代码现在将无法编译,并出现错误,指示未为类 X 定义 == 运算符。这是因为修改后的 spaceship 运算符不是默认的,编译器不会自动生成 == 运算符。在这种情况下,用户需要显式定义 == 运算符来满足其自定义类的比较需求。

以上是为什么自定义 `spaceship` 运算符在 C 20 中不生成 `==` 和 `!=` 运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn