ใน C ++ 20 วิธีการที่ผู้ประกอบการทำงานเชิงสัมพันธ์ก็เปลี่ยนสะดุดตาด้วยการแนะนำของยานอวกาศที่<=>
ผู้ประกอบการ โดยเฉพาะอย่างยิ่งถ้าคุณเพียง แต่ให้operator==
แล้วจะเขียนใหม่เพื่อa != b
!(a == b)
จาก[over.match.oper] /3.4 :
ชุดตัวเลือก rewritten ถูกกำหนดดังนี้:
- สำหรับตัวดำเนินการสัมพันธ์ ([expr.rel]) ผู้สมัครที่เขียนใหม่จะรวมผู้สมัครที่ไม่ได้เขียนใหม่ทั้งหมดสำหรับนิพจน์ x <=> y
- สำหรับตัวดำเนินการเชิงสัมพันธ์ ([expr.rel]) และการเปรียบเทียบสามทาง ([expr.spaceship]) ผู้สมัครที่เขียนใหม่ยังรวมผู้สมัครที่สังเคราะห์ด้วยคำสั่งของพารามิเตอร์ทั้งสองกลับด้านสำหรับผู้สมัครที่ไม่ได้เขียนใหม่สำหรับ นิพจน์ y <=> x
- สำหรับตัวดำเนินการ! = ([expr.eq]) ผู้สมัครที่เขียนใหม่จะรวมผู้สมัครที่ไม่ได้เขียนใหม่ทั้งหมดสำหรับนิพจน์ x == y
- สำหรับโอเปอเรเตอร์ความเท่าเทียมกันผู้สมัครที่เขียนใหม่ยังรวมผู้สมัครที่สังเคราะห์ด้วยคำสั่งของพารามิเตอร์ทั้งสองกลับด้านสำหรับผู้สมัครที่ไม่ได้เขียนใหม่สำหรับการแสดงออก y == x
- สำหรับตัวดำเนินการอื่นทั้งหมดชุดตัวเลือกที่เขียนใหม่จะว่างเปล่า
และ[over.match.oper] / 9 :
หากโอเปอเรเตอร์ที่เขียนใหม่ == ตัวเลือกถูกเลือกโดยการแก้ปัญหาโอเวอร์โหลดสำหรับโอเปอเรเตอร์ @ ชนิดส่งคืนจะเป็น cv bool และ x @ y ถูกตีความว่าเป็น:
- ถ้า @ คือ! = และผู้สมัครที่เลือกเป็นผู้สมัครสังเคราะห์ที่มีลำดับที่กลับรายการของพารามิเตอร์,! (y == x),
- มิฉะนั้นถ้า @ เป็น! =! (x == y) ,
- มิฉะนั้น (เมื่อ @ คือ ==), y == x
ในแต่ละกรณีโดยใช้ตัวดำเนินการเขียนใหม่ที่เลือก == ตัวเลือก
ดังนั้นการโอเวอร์โหลดที่ชัดเจนสำหรับoperator!=
จึงไม่จำเป็นอีกต่อไป การลบโอเปอเรเตอร์ไม่ได้เปลี่ยนซีแมนทิกส์การเปรียบเทียบ
ตู้คอนเทนเนอร์ทั้งหมดได้operator!=
ถูกลบออกไปเท่าที่ฉันสามารถบอกได้ (ตรวจสอบเช่นเรื่องย่อของเวกเตอร์ ) ข้อยกเว้นเพียงอย่างเดียวคืออะแดปเตอร์คอนเทนเนอร์std::queue
และstd::stack
: ฉันเดาว่ามันคือการรักษาความเข้ากันได้ย้อนหลังเมื่อใช้กับคอนเทนเนอร์ของบุคคลที่สามในกรณีที่ตัวดำเนินการความเท่าเทียมกันไม่สมมาตร