เมื่อวันที่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_ordering
equal
- สำหรับอาร์เรย์
T[N] <=> T[N]
ที่คัดลอกได้จะส่งคืนชนิดเดียวกับT
ของ<=>
และดำเนินการเปรียบเทียบองค์ประกอบตามพจนานุกรม ไม่มี<=>
สำหรับอาร์เรย์อื่น ๆ
- สำหรับการไม่มี
void
<=>
เพื่อทำความเข้าใจการทำงานภายในของผู้ประกอบการนี้โปรดอ่านต้นฉบับกระดาษ นี่คือสิ่งที่ฉันค้นพบโดยใช้เครื่องมือค้นหา