C ++ 20では、特に宇宙船<=>
演算子の導入により、関係演算子の動作方法が変更されました。特に、のみを指定したoperator==
場合、a != b
はに書き換えられ!(a == b)
ます。
[over.match.oper] /3.4:
書き換えられた候補セットは、次のように決定されます。
- 関係演算子([expr.rel])の場合、書き換えられた候補には、式x <=> yの書き換えられていないすべての候補が含まれます。
- 関係演算子([expr.rel])および3者間比較([expr.spaceship])演算子の場合、書き換えられた候補には、2つのパラメーターの順序が逆になった合成候補も含まれます。式y <=> x。
- !=演算子([expr.eq])の場合、書き換えられた候補には、式x == yの書き換えられていないすべての候補が含まれます。
- 等式演算子の場合、書き換えられた候補には、式y == xの書き換えられていない各候補について、2つのパラメーターの順序が逆になった合成候補も含まれます。
- 他のすべての演算子の場合、書き換えられた候補セットは空です。
そして[over.match.oper] / 9:
書き換えられたoperator ==候補が演算子@のオーバーロード解決によって選択された場合、その戻り値の型はcv boolであり、x @ yは次のように解釈されます。
- @が!=で、選択した候補がパラメーターの順序が逆の合成候補である場合、!(y == x)、
- それ以外の場合、@が!= 、!(x == y)の場合、
- それ以外の場合(@が==の場合)、y == x、
いずれの場合も、選択した書き換え済みの演算子==候補を使用します。
そのため、の明示的なオーバーロードoperator!=
は不要になりました。演算子を削除しても、比較セマンティクスは変わりません。
operator!=
私の知る限り、すべてのコンテナは削除されています(たとえば、ベクトルの概要を確認してください)。唯一の例外は、コンテナアダプタですstd::queue
とstd::stack
:私の推測では、それが等価演算子が対称でない場合には、サードパーティ製のコンテナで使用する場合の後方互換性を維持することであるということです。