C ++ 20'de ilişkisel operatörlerin çalışma şekli, özellikle uzay gemisi <=>
operatörünün tanıtılmasıyla değiştirildi . Özellikle, sadece sağlarsanız operator==
, o a != b
zaman yeniden yazılır !(a == b)
.
Gönderen [over.match.oper] /3.4 :
Yeniden yazılan aday seti şu şekilde belirlenir:
- İlişkisel ([expr.rel]) operatörler için, yeniden yazılan adaylar x <=> y ifadesi için yeniden yazılmamış tüm adayları içerir.
- İlişkisel ([expr.rel]) ve üç yönlü karşılaştırma ([expr.spaceship]) operatörleri için, yeniden yazılan adaylar ayrıca, yeniden yazılmayan her aday için, ifade y <=> x.
- ! = İşleci ([expr.eq]) için, yeniden yazılan adaylar x == y ifadesi için yeniden yazılmamış tüm adayları içerir.
- Eşitlik operatörleri için, yeniden yazılan adaylar ayrıca y == x ifadesi için yeniden yazılmamış her aday için iki parametrenin sırasını tersine çevirerek sentezlenmiş bir aday içerir.
- Diğer tüm operatörler için yeniden yazılan aday seti boştur.
Ve [over.match.oper] / 9 :
Yeniden yazılmış bir operatör == adayı bir operatör @ için aşırı yük çözünürlüğü ile seçilirse, dönüş türü cv bool olmalı ve x @ y şu şekilde yorumlanır:
- @ ise! = ise ve seçilen aday tersine çevrilmiş parametre sırasına sahip sentezlenmiş bir adaysa! (y == x),
- aksi takdirde, @!!,,! (x == y) ise ,
- aksi takdirde (@ == olduğunda), y == x,
her durumda seçilen yeniden yazılmış operatörü == aday kullanarak.
Bu nedenle, için açık bir aşırı yükleme operator!=
artık gerekli değildir. Operatörün kaldırılması karşılaştırma semantiğini değiştirmedi.
Anlayabildiğim operator!=
kadarıyla tüm kaplar çıkarılmıştı (örneğin vektör sinopsisini kontrol edin ). Tek istisna konteyner adaptörleridir std::queue
ve std::stack
: tahminim, eşitlik operatörlerinin simetrik olmaması durumunda üçüncü taraf konteynerlerle kullanıldığında geriye dönük uyumluluğu korumaktır.