为什么在C ++ 20中删除了std :: type_info :: operator!=?

Aco*_*gua 28 c++ c++20

根据cppreferencestd::type_info::operator!=被C ++ 20删除,但是std::type_info::operator==显然仍然存在。

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

相比之下,必须编写if(!(id1 == id2))并不会使任何代码更清晰if(id1 != id2),相反,相反……

N. *_*ead 68

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

来自[over.match.oper]/3.4

重写的候选集确定如下:

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

[over.match.oper]/9

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

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

在每种情况下都使用选定的重写 operator== 候选。

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

operator!=据我所知,所有容器都已被移除(例如检查向量概要)。唯一的例外是容器适配器std::queuestd::stack:我的猜测是在与第三方容器一起使用时保持向后兼容性,以防等式运算符不对称。

  • [p1614](https://wg21.link/p1614) 也可能令人感兴趣,因为我相信这是消除超载的提案。 (8认同)

Sto*_*ica 29

我们不再需要提供图书馆operator!=。提供operator==让编译器做一些杂耍和评估a != b来讲a == b,都在它自己的。

[over.match.oper]

3对于一元运算符@,其操作数的类型为cv不合格的版本为T1,对于二元运算符@,其左操作数的类型为cv不合格的版本为T1,而右运算符的类型为cv-不合格版本为T2,按以下方式构造四组候选函数,指定成员候选,非成员候选,内置候选和重写候选:

3.4.3对于!=运算符([expr.eq]),重写的候选项包括表达式x == y的所有未重写的候选项。

std::type_infooperator!=作为P1614的一部分,删除了更多的库类型-“母舰降落”