根据cppreference,std::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)。
重写的候选集确定如下:
- 对于关系 ([expr.rel]) 运算符,重写的候选项包括表达式 x <=> y 的所有未重写的候选项。
- 对于关系([expr.rel])和三路比较([expr.spaceship])算子,重写的候选者还包括一个合成的候选者,两个参数的顺序颠倒了,对于每个未重写的候选者表达式 y <=> x。
- 对于 != 运算符 ([expr.eq]),重写的候选项包括表达式 x == y 的所有未重写的候选项。
- 对于等式运算符,对于表达式 y == x 的每个未重写候选,重写候选还包括一个合成候选,两个参数的顺序颠倒。
- 对于所有其他算子,重写的候选集为空。
如果通过重载决议为 operator@ 选择了重写的 operator== 候选者,则其返回类型应为 cv bool,并且 x@y 被解释为:
- 如果@ 是 != 并且选择的候选是参数顺序相反的合成候选,!(y == x),
- 否则,如果 @ 是 !=, !(x == y),
- 否则(当@ 是 == 时),y == x,
在每种情况下都使用选定的重写 operator== 候选。
因此,operator!=不再需要显式重载 for 。运算符的移除并没有改变比较语义。
operator!=据我所知,所有容器都已被移除(例如检查向量概要)。唯一的例外是容器适配器std::queue和std::stack:我的猜测是在与第三方容器一起使用时保持向后兼容性,以防等式运算符不对称。
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的一部分,删除了更多的库类型-“母舰降落”。
| 归档时间: |
|
| 查看次数: |
444 次 |
| 最近记录: |