Tại sao toán tử! = Bị xóa trong C ++ 20 cho nhiều loại thư viện chuẩn?


44

Theo cppreference , std::type_info::operator!=bị loại bỏ bằng C ++ 20, tuy nhiên, std::type_info::operator==dường như vẫn còn.

Lý do đằng sau là gì? Tôi có thể đồng ý về việc so sánh sự bất bình đẳng là vô nghĩa, nhưng sau đó so sánh về sự bình đẳng cũng sẽ vô nghĩa như vậy, phải không?

Tương tự, operator!=trong số nhiều loại thư viện tiêu chuẩn khác, bao gồm các thùng chứa như std::unordered_map::operator!=std::unordered_set::operator!=sẽ bị xóa trong C ++ 20 theo cppreference.

Phải viết if(!(id1 == id2))không làm cho bất kỳ mã nào rõ ràng hơn so với if(id1 != id2), ngược lại, ngược lại ...

Câu trả lời:


62

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.

[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::queuestd::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.


7
p1614 cũng có thể được quan tâm, vì tôi tin rằng đó là đề xuất loại bỏ quá tải.
N. Shead

39

Chúng tôi không cần một thư viện được cung cấp operator!=nữa. Cung cấp operator==cho phép trình biên dịch thực hiện một số trò tung hứng và đánh giá a != bvề mặt a == b, tất cả đều tự nó.

[over.match.oper]

3 Đối với toán tử đơn nguyên @ có toán hạng loại có phiên bản không đủ tiêu chuẩn cv là T1 và đối với toán tử nhị phân @ với toán hạng bên trái của loại có phiên bản không đủ tiêu chuẩn cv là T1 và toán hạng bên phải của loại có cv- phiên bản không đủ tiêu chuẩn là T2, bốn bộ chức năng ứng cử viên, ứng cử viên thành viên được chỉ định, ứng cử viên không phải thành viên, ứng cử viên tích hợp và ứng viên viết lại, được xây dựng như sau:

3.4.3 Đố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.

std::type_infovà nhiều loại thư viện khác đã operator!=bị xóa như là một phần của P1614 - The Mothership đã hạ cánh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.