Dalam C ++ 20 cara operator relasional bekerja diubah, terutama dengan diperkenalkannya <=>
operator pesawat ruang angkasa . Secara khusus, Jika Anda hanya menyediakan operator==
, maka a != b
ditulis ulang menjadi !(a == b)
.
Dari [over.match.oper] /3.4 :
Set kandidat yang ditulis ulang ditentukan sebagai berikut:
- Untuk operator relasional ([expr.rel]), kandidat yang ditulis ulang menyertakan semua kandidat yang tidak ditulis ulang untuk ekspresi x <=> y.
- Untuk operator relasional ([expr.rel]) dan perbandingan tiga arah ([expr.spaceship]), kandidat yang ditulis ulang juga menyertakan kandidat yang disintesis, dengan urutan dua parameter terbalik, untuk setiap kandidat yang tidak ditulis ulang untuk ekspresi y <=> x.
- Untuk operator! = ([Expr.eq]), kandidat yang ditulis ulang menyertakan semua kandidat yang tidak ditulis ulang untuk ekspresi x == y.
- Untuk operator kesetaraan, kandidat yang ditulis ulang juga menyertakan kandidat yang disintesis, dengan urutan dua parameter dibalik, untuk setiap kandidat yang tidak ditulis ulang untuk ekspresi y == x.
- Untuk semua operator lain, set kandidat yang ditulis ulang kosong.
Dan [over.match.oper] / 9 :
Jika operator yang ditulis ulang == kandidat dipilih oleh resolusi berlebihan untuk operator @, jenis kembalinya harus cv bool, dan x @ y ditafsirkan sebagai:
- jika @ is! = dan kandidat yang dipilih adalah kandidat yang disintesis dengan urutan parameter terbalik,! (y == x),
- jika tidak, jika @ adalah! =,! (x == y) ,
- jika tidak (ketika @ adalah ==), y == x,
dalam setiap kasus menggunakan operator ditulis ulang == kandidat yang dipilih.
Dengan demikian, kelebihan yang eksplisit untuk operator!=
tidak lagi diperlukan. Penghapusan operator tidak mengubah semantik perbandingan.
Semua wadah telah operator!=
dihapus, sejauh yang saya tahu (periksa misalnya vektor sinopsis ). Satu-satunya pengecualian adalah adaptor wadah std::queue
dan std::stack
: dugaan saya adalah untuk menjaga kompatibilitas ke belakang saat digunakan dengan wadah pihak ketiga, seandainya operator kesetaraan tidak simetris.