Mengapa operator! = Dihapus dalam C ++ 20 untuk banyak tipe perpustakaan standar?

44

Menurut cppreference , std::type_info::operator!=dihapus dengan C ++ 20, bagaimanapun, std::type_info::operator==tampaknya tetap.

Apa alasan di baliknya? Saya mungkin setuju untuk membandingkan ketidaksetaraan menjadi tidak berarti, tetapi kemudian membandingkan kesetaraan akan sama tidak berartinya, bukan?

Demikian pula, operator!=dari banyak jenis perpustakaan standar lainnya, termasuk wadah seperti std::unordered_map::operator!=dan std::unordered_set::operator!=akan dihapus dalam C ++ 20 sesuai dengan preferensipengaturan.

Harus menulis if(!(id1 == id2))tidak membuat kode lebih jelas dibandingkan dengan if(id1 != id2), sebaliknya, justru sebaliknya ...

Aconcagua
sumber

Jawaban:

62

Dalam C ++ 20 cara operator relasional bekerja diubah, terutama dengan diperkenalkannya <=>operator pesawat ruang angkasa . Secara khusus, Jika Anda hanya menyediakan operator==, maka a != bditulis 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::queuedan std::stack: dugaan saya adalah untuk menjaga kompatibilitas ke belakang saat digunakan dengan wadah pihak ketiga, seandainya operator kesetaraan tidak simetris.

N. Shead
sumber
7
p1614 mungkin menarik juga, karena saya percaya itu adalah proposal yang menghilangkan kelebihan.
N. Shead
39

Kami tidak membutuhkan perpustakaan yang disediakan operator!=lagi. Memberikan operator==memungkinkan kompiler untuk melakukan beberapa juggling dan mengevaluasi a != bdalam hal a == b, semua dengan sendirinya.

[over.match.oper]

3 Untuk operator unary @ dengan operan jenis yang versi cv-tidak memenuhi syarat adalah T1, dan untuk operator biner @ dengan operan kiri jenis yang versi cv-tidak memenuhi syarat adalah T1 dan operan kanan dari jenis yang cv- versi wajar tanpa pengecualian adalah T2, empat set fungsi kandidat, kandidat anggota yang ditunjuk, kandidat non-anggota, kandidat bawaan, dan kandidat yang ditulis ulang, dibangun sebagai berikut:

3.4.3 Untuk operator! = ([Expr.eq]), kandidat yang ditulis ulang menyertakan semua kandidat yang tidak ditulis ulang untuk ekspresi x == y.

std::type_infodan masih banyak lagi tipe perpustakaan yang operator!=dihapus sebagai bagian dari P1614 - The Mothership telah Landed .

StoryTeller - Unslander Monica
sumber