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

时间:2019-10-10 09:39:44

标签: c++ c++20

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

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

if(!(id1 == id2))相比,if(id1 != id2)的编写并没有使任何代码更清晰,相反,相反...

2 个答案:

答案 0 :(得分:64)

在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 ==候选对象,则其返回类型为cv bool,x @ y解释为:

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

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

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

据我所知,所有容器均已移除其operator!=(例如,检查the vector synopsis)。唯一的例外是容器适配器std::queuestd::stack:我的猜测是,如果与相等的容器不相等,则当与第三方容器一起使用时,它将保留向后兼容性。

答案 1 :(得分:30)

我们不再需要operator!=提供的库。提供operator==可使编译器自己进行一些变通并根据a != b评估a == b

  

[over.match.oper]

     

3对于一元运算符@,其操作数的类型为   cv不合格的版本是T1,对于二进制运算符@,左   简历不合格版本为T1且类型为右的类型的操作数   cv不合格版本为T2的类型的操作数,四组   候选人职能,指定成员候选人,非成员   候选人,内置候选人和改写的候选人是   构造如下:

     

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

std::type_info和许多其他库类型已将其operator!=作为P1614 - The Mothership has Landed的一部分删除。