首页 > 后端开发 > C++ > 正文

为什么在 C 20 中不能将 `==` 和 `!=` 与自定义 `<=>` 运算符一起使用?

Linda Hamilton
发布: 2024-11-07 21:11:03
原创
985 人浏览过

Why Can't I Use `==` and `!=` with a Custom `<=>` C 20 中的运算符? 
` C 20 中的运算符? " />

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

在 C 20 中,宇宙飞船运算符 ; 提供了通用比较机制。但是,使用自定义三向比较实现时会出现奇怪的行为。

默认实现生成 == 和 !=

考虑使用 的默认实现的以下代码:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) const = default; // Default implementation
};
登录后复制

在这种情况下,代码编译成功并允许使用 == 和 != 来比较 X 的实例:

X a, b;

a == b; // OK!
登录后复制

自定义实现块 == 和 !=

但是,当提供 的自定义实现时:

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

编译导致错误:

error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
登录后复制

行为原因

根据 C 20 标准,此行为是故意的:

如果类定义没有显式声明 == 运算符函数,而是声明默认三向比较函数,则隐式声明 == 运算符函数,其访问权限与三向比较运算符函数相同.

只有默认的;运算符生成一个合成的 ==。这是因为像 std::vector 这样的类不应该使用非默认的 。对于相等测试,因为它可能比自定义实现效率低。

因此,如果一个类有一个自定义 ;实现时,程序员还必须提供自定义 == 实现以确保正确的比较行为。

以上是为什么在 C 20 中不能将 `==` 和 `!=` 与自定义 `<=>` 运算符一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!