Trong C ++ 20, cách mà các toán tử quan hệ làm việc đã được thay đổi, đáng chú ý là sự ra đời của <=>
toán tử tàu vũ trụ . Cụ thể, nếu bạn chỉ cung cấp operator==
, sau đó a != b
được viết lại !(a == b)
.
Từ [over.match.oper] /3.4 :
Bộ ứng cử viên viết lại được xác định như sau:
- Đối với các toán tử quan hệ ([expr.rel]), các ứng cử viên viết lại bao gồm tất cả các ứng cử viên không viết lại cho biểu thức x <=> y.
- Đối với các toán tử quan hệ ([expr.rel]) và so sánh ba chiều ([expr.spaceship]), các ứng cử viên viết lại cũng bao gồm một ứng cử viên được tổng hợp, với thứ tự của hai tham số được đảo ngược, cho mỗi ứng cử viên không được viết lại cho biểu thức y <=> x.
- Đối với toán tử! = ([Expr.eq]), các ứng cử viên viết lại bao gồm tất cả các ứng cử viên không viết lại cho biểu thức x == y.
- Đối với các toán tử đẳng thức, các ứng cử viên viết lại cũng bao gồm một ứng cử viên được tổng hợp, với thứ tự của hai tham số được đảo ngược, cho mỗi ứng cử viên không viết lại cho biểu thức y == x.
- Đối với tất cả các toán tử khác, bộ ứng cử viên viết lại là trống.
Và [over.match.oper] / 9 :
Nếu một toán tử viết lại == ứng cử viên được chọn theo độ phân giải quá tải cho toán tử @, kiểu trả về của nó sẽ là cv bool và x @ y được hiểu là:
- if @ is! = và ứng cử viên được chọn là một ứng cử viên được tổng hợp với thứ tự các tham số đảo ngược ,! (y == x),
- mặt khác, nếu @ là! = ,! (x == y) ,
- mặt khác (khi @ là ==), y == x,
trong mỗi trường hợp sử dụng toán tử viết lại đã chọn == ứng cử viên.
Như vậy, quá tải rõ ràng operator!=
là không còn cần thiết. Việc loại bỏ toán tử không thay đổi ngữ nghĩa so sánh.
Tất cả các container đã operator!=
bị loại bỏ, theo như tôi có thể nói (kiểm tra ví dụ tóm tắt vectơ ). Ngoại lệ duy nhất là bộ điều hợp bộ chứa std::queue
và std::stack
: tôi đoán là để duy trì khả năng tương thích ngược khi được sử dụng với bộ chứa của bên thứ ba, trong trường hợp các toán tử đẳng thức không đối xứng.