根据参考参数 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(使用前将#替换为@)