根据cppreference,std::unordered_map::operator!=
和std::unordered_map::operator!=
在C ++ 20中被删除。
[委员会的决定依据是什么?是否会使比较支持不对称?
在C ++ 20中,关系运算符的工作方式发生了变化,特别是通过引入太空飞船std::unordered_set::operator!=
运算符。特别是,如果仅提供std::unordered_set::operator!=
,则<=>
将自动合成为operator==
。
来自operator!=
:
重写的候选集确定如下:
- 对于关系([expr.rel])运算符,重写的候选包括表达式x <=> y的所有未重写的候选。
- 对于关系([expr.rel])和三向比较([expr.spaceship])运算符,对于每个未重写的候选者,重写的候选者还包括一个合成的候选者,两个参数的顺序相反对于表达式y <=> x。
- 对于!=运算符([expr.eq]),重写的候选包括表达式x == y的所有未重写的候选。
- 对于相等运算符,对于表达式y == x的每个未重写候选,重写的候选还包括两个参数的顺序相反的合成候选。
- 对于所有其他运算符,重写的候选集为空。
和!(a == b)
:
如果通过重载决议为运算符@选择了重写的运算符==候选,其返回类型应为cv bool,并且x @ y解释为:
- 如果@是!=,并且所选候选是参数相反顺序的合成候选,!(y == x),
- 否则,如果@是!=,!(x == y),
- 否则(当@是==时,y == x,
在每种情况下都使用选择的重写运算符==候选。
因此,不再需要[over.match.oper]/3.4的显式重载。删除运算符并未更改比较语义。
据我所知,所有容器都已删除其[over.match.oper]/9(例如,检查operator!=
。似乎cppreference尚未更新其所有页面以使其精确到C ++ 20。