You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20中==与<=>反向比较运算符自动生成的标准条款查询

C++20中反向比较运算符自动调用的标准依据

你提到的这个特性是C++20新增的相等运算符对称决议规则,对应的标准条款在 [over.match.oper](运算符重载匹配)章节,而非[class.compare](类比较运算符默认生成)章节,具体细节如下:

核心规则位置

在C++20标准的 [over.match.oper]/3.2.2 和 [over.match.oper]/7 中明确了这一行为:

  • 当处理形如a == b的表达式时,如果直接查找operator==(a, b)未找到可行重载,编译器会尝试查找operator==(b, a),并将表达式等价转换为b == a进行调用。
  • 该规则同样适用于!=运算符,以及三路比较运算符<=>的反向匹配(如a <=> b找不到时,尝试b <=> a并反转结果)。

对应你的示例解释

对于代码中的A{} == B{}:

  • C++17及更早版本中,编译器只会查找A::operator==(const B&)或全局operator==(const A&, const B&),找不到就会报错。
  • C++20中,编译器会触发对称决议逻辑,查找B::operator==(const A&),并将表达式转换为B{} == A{}来调用,因此static_assert(A{} == B{})可以通过编译。

为什么[class.compare]找不到?

[class.compare]章节主要负责定义类的默认比较运算符生成规则(比如用<=>默认生成==、<等运算符),而你问的反向调用属于运算符重载的匹配决议阶段的逻辑,因此归属[over.match.oper]章节。

内容的提问来源于stack exchange,提问作者vvv444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:14:58