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
相关产品推荐
相关产品推荐

