เมื่อวันที่2017/11/11 , มาตรฐาน ISO c ++ คณะกรรมการนำมาใช้ สมุนไพร Sutterข้อเสนอ 's สำหรับ'ยานอวกาศ' ดำเนินการเปรียบเทียบสามทาง <=>เป็นหนึ่งในคุณสมบัติใหม่ที่ถูกเพิ่มเข้ามาในC ++ 20 ในบทความที่ชื่อว่าSutter Comparison ที่สอดคล้องกัน Maurer และ Brown แสดงให้เห็นถึงแนวคิดของการออกแบบใหม่ สำหรับภาพรวมของข้อเสนอนี่เป็นข้อความที่ตัดตอนมาจากบทความ:
นิพจน์a <=> bส่งคืนวัตถุที่เปรียบเทียบ<0ถ้า<bเปรียบเทียบ> 0ถ้าa> bและเปรียบเทียบ== 0ถ้า a และ b เท่ากับ / เทียบเท่า
กรณีทั่วไป:หากต้องการเขียนการเปรียบเทียบทั้งหมดสำหรับประเภทXของคุณด้วยประเภทYพร้อมซีแมนทิกส์ความหมายสมาชิกเพียงเขียน
auto X::operator<=>(const Y&) =default;
กรณีขั้นสูง:หากต้องการเขียนการเปรียบเทียบทั้งหมดสำหรับประเภทXของคุณด้วยประเภทYเพียงแค่เขียนโอเปอเรเตอร์ <=>ที่รับYสามารถใช้
= ค่าเริ่มต้นเพื่อให้ได้ความหมายสมาชิกตามต้องการหากต้องการและส่งคืนประเภทหมวดหมู่ที่เหมาะสม:
- ส่งคืน_orderingหากประเภทของคุณรองรับ<และเราจะสร้างสมมาตร< , > , <= , > = , == , และ
! = ; มิฉะนั้นกลับ_equalityและเราได้อย่างมีประสิทธิภาพจะสร้างสมมาตร==และ! =
- ย้อนกลับstrong_ถ้าสำหรับประเภทของคุณ== มาขหมายถึงf (ก) == f (ข) (ทดแทนที่ฉอ่านเพียงรัฐเปรียบเทียบเด่นที่สามารถเข้าถึงได้โดยใช้ประชาชนconstสมาชิก) มิฉะนั้นกลับ
weak_
หมวดเปรียบเทียบ
การเปรียบเทียบห้าหมวดหมู่ถูกกำหนดเป็นstd::ประเภทโดยแต่ละประเภทมีค่าที่กำหนดไว้ล่วงหน้าดังต่อไปนี้:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
การแปลงโดยนัยระหว่างประเภทเหล่านี้มีการกำหนดไว้ดังนี้:
strong_orderingด้วยค่า { less, equal, greater} โดยปริยายแปลงไป:
weak_orderingด้วยค่า { less, equivalent, greater}
partial_orderingด้วยค่า { less, equivalent, greater}
strong_equalityด้วยค่า { unequal, equal, unequal}
weak_equalityด้วยค่า { nonequivalent, equivalent, nonequivalent}
weak_orderingด้วยค่า { less, equivalent, greater} โดยปริยายแปลงไป:
partial_orderingด้วยค่า { less, equivalent, greater}
weak_equalityด้วยค่า { nonequivalent, equivalent, nonequivalent}
partial_orderingด้วยค่า { less, equivalent, greater, unordered} โดยปริยายแปลงไป:
weak_equalityด้วยค่า { nonequivalent, equivalent, nonequivalent, nonequivalent}
strong_equalityด้วยค่า { equal, unequal} แปลงเป็น:
weak_equalityด้วยค่า { equivalent, nonequivalent}
การเปรียบเทียบสามทาง
<=>โทเค็นเป็นที่รู้จัก ลำดับอักขระโท<=>เค็<= >นในรหัสต้นฉบับเก่า ตัวอย่างเช่นX<&Y::operator<=>ต้องการเพิ่มช่องว่างเพื่อรักษาความหมายของมัน
ผู้ประกอบการ overloadable <=>เป็นฟังก์ชั่นการเปรียบเทียบสามทางและมีความสำคัญสูงกว่าและต่ำกว่า< <<ส่งคืนชนิดที่สามารถเปรียบเทียบกับตัวอักษร0แต่อนุญาตให้ส่งคืนชนิดอื่นเช่นสนับสนุนเทมเพลตนิพจน์ <=>ตัวดำเนินการทั้งหมดที่กำหนดไว้ในภาษาและในไลบรารีมาตรฐานส่งคืนหนึ่งในstd::ประเภทการเปรียบเทียบ5 ประเภทดังกล่าวข้างต้น
สำหรับประเภทภาษา<=>จะมีการเปรียบเทียบชนิดเดียวกันในตัวต่อไปนี้ ทั้งหมดเป็นconstexprยกเว้นที่ระบุไว้เป็นอย่างอื่น การเปรียบเทียบเหล่านี้ไม่สามารถเรียกคืนได้อย่างหลากหลายโดยใช้การส่งเสริม / แปลงสเกลาร์
- สำหรับ
boolครบถ้วนและประเภทตัวชี้ผลตอบแทน <=>strong_ordering
- สำหรับประเภทตัวชี้คุณสมบัติ cv ที่แตกต่างกันและการแปลงที่ได้รับมาจากฐานจะได้รับอนุญาตให้เรียกใช้บิวด์อินที่เป็นเนื้อเดียวกัน
<=>และมีความหลากหลายในoperator<=>(T*, nullptr_t)ตัว การเปรียบเทียบพอยน์เตอร์กับวัตถุ / การจัดสรรเดียวกันเท่านั้นคือนิพจน์คงที่
- สำหรับชนิดจุดลอยพื้นฐานให้
<=>ส่งคืนpartial_orderingและสามารถเรียกใช้แบบ heterogeneously โดยขยายอาร์กิวเมนต์ให้เป็นประเภทจุดลอยขนาดใหญ่
- สำหรับ enumerations, ผลตอบแทนเช่นเดียวกับการแจงนับเป็นพื้นฐานของประเภท
<=><=>
- สำหรับ
nullptr_t, <=>ผลตอบแทนและอัตราผลตอบแทนเสมอstrong_orderingequal
- สำหรับอาร์เรย์
T[N] <=> T[N]ที่คัดลอกได้จะส่งคืนชนิดเดียวกับTของ<=>และดำเนินการเปรียบเทียบองค์ประกอบตามพจนานุกรม ไม่มี<=>สำหรับอาร์เรย์อื่น ๆ
- สำหรับการไม่มี
void<=>
เพื่อทำความเข้าใจการทำงานภายในของผู้ประกอบการนี้โปรดอ่านต้นฉบับกระดาษ นี่คือสิ่งที่ฉันค้นพบโดยใช้เครื่องมือค้นหา