为什么在 C++20 中删除了许多标准库类型的运算符!=?

2024-01-04

根据参考参数 https://en.cppreference.com/w/cpp/types/type_info/operator_cmp, std::type_info::operator!=然而,C++20 已将其删除,std::type_info::operator==显然仍然存在。

背后的原因是什么?我可能同意比较不平等是没有意义的,但是比较平等也同样没有意义,不是吗?

相似地,operator!=许多其他标准库类型,包括容器,例如std::unordered_map::operator!= https://en.cppreference.com/w/cpp/container/unordered_map/operator_cmp and std::unordered_set::operator!= https://en.cppreference.com/w/cpp/container/unordered_set/operator_cmp根据 cppreference,将在 C++20 中删除。

不得不写if(!(id1 == id2))与相比,没有使任何代码更清晰if(id1 != id2),相反,恰恰相反……


在 C++20 中,关系运算符的工作方式发生了变化,特别是随着宇宙飞船的引入<=>操作员。特别是,如果您只提供operator==, then a != b被重写为!(a == b).

From [over.match.oper]/3.4 http://eel.is/c++draft/over.match.oper#3.4:

重写后的候选集确定如下:

  • 对于关系 ([expr.rel]) 运算符,重写的候选者包括表达式 x y 的所有未重写的候选者。
  • 对于关系 ([expr.rel]) 和三向比较 ([expr.spaceship]) 运算符,重写的候选者还包括一个合成候选者,其中两个参数的顺序相反,对于每个未重写的候选者表达式 y x。
  • 对于 != 运算符 ([expr.eq]),重写的候选者包括表达式 x == y 的所有未重写的候选者。
  • 对于相等运算符,对于表达式 y == x 的每个非重写候选,重写候选还包括一个合成候选,其中两个参数的顺序相反。
  • 对于所有其他运算符,重写后的候选集为空。

And [超过匹配操作]/9 http://eel.is/c++draft/over.match.oper#3.4:

如果通过重载决议为运算符 @ 选择重写的运算符 == 候选者,则其返回类型应为 cv bool,并且 x @ y 解释为:

  • 如果 @ 是 != 并且所选候选者是具有相反参数顺序的合成候选者 !(y == x),
  • 否则,如果 @ 是 !=, !(x == y),
  • 否则(当@为==时),y == x,

在每种情况下都使用选定的重写运算符 == 候选者。

因此,显式重载operator!=不再需要了。删除运算符并没有改变比较语义。

所有容器都有其operator!=据我所知,已删除(例如检查向量概要 http://eel.is/c++draft/vector.syn)。唯一的例外是容器适配器std::queue and std::stack:我的猜测是,它是为了在与第三方容器一起使用时保持向后兼容性,以防相等运算符不对称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 C++20 中删除了许多标准库类型的运算符!=? 的相关文章

随机推荐

  • Dart DateTime.parse timeZoneOffset 始终为 0

    DateTime parse 创建的 DateTime 似乎总是为 timeZoneOffset 返回 0 我在非 UTC 时区中创建了一个 ISO8601 字符串 https timestampgenerator com 16100103
  • 如何使 say 命令回显脚本中的变量值?

    我使用的是 Mac 有时我会使用say命令位于我的脚本末尾 如下所示 system say Finished successfully 但如果我尝试插入一个变量 system say my variable 它不起作用 它仅回显变量名称 我
  • 使用 dllexport 从 DLL 导出函数

    我想要一个从 C Windows DLL 导出函数的简单示例 我想看看标题 cpp文件 以及 def文件 如果绝对需要 我希望导出的名称是未装饰的 我想使用最标准的调用约定 stdcall 我想要使 用 declspec dllexport
  • 如何通过单击按钮从“关于”返回到上一个活动?

    我试图通过单击按钮从 关于 对话框返回到主要活动 public class AboutActivity extends Activity implements OnClickListener Override protected void
  • 单个 MemoryCache 实例与多个 MemoryCache 实例

    MemoryCache 默认情况下带有默认缓存 并且可以创建其他命名缓存 似乎在不同实例中隔离不同进程的结果的缓存可能有优势 例如 针对索引的查询结果可以缓存在 IndexQueryResult 缓存中 而数据库查询的结果可以缓存在 Dat
  • 更改滑动选项卡布局中的颜色指示器

    我想问一下SlidingTablayout中的选项卡指示器的颜色是否可以更改 我必须使用developer android com 上的SlidingTabsColors 吗 我只想更改另一种颜色而不是默认的蓝色 我认为 请指教 谢谢 只是
  • SwiftUI 坐标空间

    有谁知道 SwiftUI 是如何在坐标空间上渲染的 看起来框架的原点现在不在0 0在左上角 例如添加一个Text使用修饰符会将标签偏移到视图之外 var body some View Text my long enough string p
  • 带有 WMS 和自定义投影的传单地图

    我已经使用 WMS 服务中的 Leaflet 和图块实现了地图 他们提供了一系列预测 其中一个可在标准传单 EPSG 4326 中使用 然而 地图看起来有点扭曲 我认为其他投影之一会更好 地图供应商使用 EPSG 32624 但我似乎无法获
  • 我如何使用 keras 创建 3d 输入/3d 输出卷积模型?

    我有一个小问题无法解决 我想使用完全连接的 MLP 来实现 CNN 模型到我的蛋白质数据库 该数据库有 2589 个蛋白质 每个蛋白质有 1287 行和 69 列作为输入 1287 行和 8 列作为输出 实际上有 1287x1 输出 但我对
  • Jacoco 和 Sonar 代码覆盖率?

    Using JaCoCo 0 5 3 Maven2 声纳 2 14 声纳 maven 插件 1 8 S artGWT 3 0 目前正在尝试 在 Sonar 上获取我的 Selenium 单元测试的代码覆盖率 问题 尽管传感器正确启动 代码覆
  • 使用 pyinstaller 制作的 exe 文件被 Windows Defender 报告为病毒威胁

    我正在尝试使用 pyinstaller 为学校项目创建一个 exe 但是 Windows Defender 似乎报告病毒威胁并阻止该文件 我想将此 exe 发送给其他人 但除非我修复此问题 否则我无法做到这一点 所以这些是我的疑问 为什么e
  • 用PHP替换JAVA进行PKCS5加密

    我的任务是用运行 PHP 的系统替换旧的 Java 系统 我在用 PHP 代码替换 java 加密方面遇到了一些困难 cipherAlgorythm PBEWithMD5AndDES cipherTransformation PBEWith
  • R 错误“加载命名空间‘timetk’时未找到对象‘required_pkgs’”

    我在 macOS 11 1 上使用 R 4 0 3 和 RStudio 1 2 5033 我已经使用成功安装了该软件包install packages timetk 当尝试加载包时library timetk 我收到以下错误 错误 time
  • 禁用有关程序尝试发送电子邮件的警告

    我使用 Outlook 2010 和 Access VBA 发送电子邮件 我收到来自 Microsoft Outlook 的关于某个程序试图发送电子邮件的警告 我被迫按下允许 我有 VBA 参考中的 Microsoft Outlook 对象
  • while 循环会在一段时间后停止执行吗? [复制]

    这个问题在这里已经有答案了 所以我目前正在尝试多线程 因为我对 Java 还很陌生 现在 我有多个线程 它们都影响同一个长变量 然而 似乎在除了检查 if 语句之外不做任何事情之后 while 循环就停止执行 如 它无限循环 如果我只是在
  • WCF 中 IIS 下的一个虚拟目录中是否可以有多个 .svc 文件?

    WCF 中 IIS 下的一个虚拟目录中是否可以有多个 svc 文件 如果是这样怎么办 您需要有两份服务合同 并且web config部分您需要注册这两项服务
  • 非id字段的环回关系

    我想指定 2 个 mssql 表之间的关系 付款类别和付款 paymentcategory id 连接到 payout category 列 在 payout json 模型中 我指定为foreignKey id relations pay
  • 跟踪像素是否需要具有 alt 属性才能实现可访问性(WCAG 2.0)?

    我们正在运行一个网站并拥有第三方跟踪像素 但我们正在接收alt在我们的网站上进行 webaim WCAG 2 0 扫描时出现属性错误 我不确定在这种情况下跟踪像素是否确实需要仍然有空白alt属性或者某些屏幕阅读器仍然会读取src alt 在
  • 最长公共子序列实现-python

    我已经按照本中的说明实现了最长公共子序列问题video https www youtube com watch v xnWqLAI3TKs 它只执行第一组代码并生成一个空列表 这个实现有什么问题吗 def lcs recursive xli
  • 为什么在 C++20 中删除了许多标准库类型的运算符!=?

    根据参考参数 https en cppreference com w cpp types type info operator cmp std type info operator 然而 C 20 已将其删除 std type info o