`equality_comparable_with` จำเป็นต้องใช้` common_reference` หรือไม่?


12

แนวคิดequality_­comparable_with<T, U>มีจุดมุ่งหมายที่จะประกาศวัตถุชนิดที่TและUสามารถนำมาเปรียบเทียบเท่ากับแต่ละอื่น ๆ และถ้าพวกเขาอยู่แล้วนี้มีความหมายที่คาดหวัง ไม่เป็นไร.

อย่างไรก็ตามแนวคิดนี้ยังต้องcommon_reference_t<T&, U&>มีอยู่ แรงกระตุ้นหลักสำหรับcommon_referenceและฟังก์ชั่นการดูแลของมันดูเหมือนว่าจะเปิดใช้งานตัวทำซ้ำพร็อกซีเพื่อให้มีสถานที่ที่จะเป็นตัวแทนของความสัมพันธ์ระหว่างreferenceและvalue_typeสำหรับการทำซ้ำดังกล่าว

เยี่ยมมาก แต่ ... สิ่งใดที่เกี่ยวข้องกับการทดสอบว่า a Tและ a Uสามารถเปรียบเทียบกันได้หรือไม่ ทำไมมาตรฐานจึงต้องการสิ่งนั้นTและUมีความสัมพันธ์อ้างอิงร่วมกันเพียงเพื่อให้คุณสามารถเปรียบเทียบพวกเขาได้เท่ากัน?

สิ่งนี้จะสร้างสถานการณ์คี่บอลซึ่งเป็นการยากมากที่จะมีสองประเภทซึ่งไม่มีเหตุผลพอสมควรที่มีความสัมพันธ์อ้างอิงทั่วไปที่เทียบเคียงได้ในเชิงตรรกะ ตัวอย่างเช่นvector<int>และpmr::vector<int>เหตุผลควรเปรียบเทียบ แต่ไม่สามารถทำได้เพราะไม่มีการอ้างอิงทั่วไปที่สมเหตุสมผลระหว่างสองประเภทที่ไม่เกี่ยวข้องกัน


@Marshall จะอนุมัติคำถามนี้
Barry

แม้assignable_fromต้องใช้common_reference...
cpplearner

@cpplearner: อย่างน้อยก็ค่อนข้างสมเหตุสมผลเนื่องจากการมอบหมายเป็นคุณสมบัติที่การอ้างอิงและค่าพร็อกซีคาดว่าจะแบ่งปัน
Nicol Bolas

คำตอบ:


4

สิ่งนี้ไปตลอดทางจนถึงรายงาน Palo Alto , §3.3และ D.2

สำหรับแนวคิด cross-type ที่จะให้เสียงทางคณิตศาสตร์คุณต้องกำหนดความหมายของการเปรียบเทียบ cross-type สำหรับequality_comparable_with, t == uโดยทั่วไปหมายถึงtและuมีค่าเท่ากัน แต่สิ่งที่ไม่ได้หมายถึงแม้สองมูลค่าของประเภทที่แตกต่างกันจะเท่ากับ? การออกแบบกล่าวว่าความเท่าเทียมกันระหว่าง cross-type ถูกกำหนดโดยการแม็พกับชนิด (การอ้างอิง) ทั่วไป (การแปลงนี้จำเป็นเพื่อรักษาค่า)

ในกรณีที่หลักการที่แข็งแกร่งของequality_comparable_withไม่พึงปรารถนามาตรฐานใช้แนวคิดรวบยอดเท่านั้นweakly-equality-comparable-withและแนวคิดนั้นไม่ต้องการการอ้างอิงทั่วไป มันเป็น แต่เป็น "ความหมายของสิ่งที่น่ารังเกียจ" (ในคำพูดของเคซี่ย์คาร์เตอร์) และเป็นแสดงออกเท่านั้นด้วยเหตุผลว่ามันจะช่วยให้มีt == uและt2 == uแต่t != t2(นี้เป็นจริงที่จำเป็นสำหรับการรักษาการณ์)


2
นั่นเป็นเรื่องที่น่าสนใจ แต่ไม่ได้อธิบายว่าเพราะเหตุใดโซลูชัน "เสียงทางคณิตศาสตร์" จึงเกี่ยวข้องกับประเภท "การอ้างอิงทั่วไป" แทนที่จะเป็น ... เอาละมีอย่างอื่นอีกแล้ว นั่นคือสาเหตุที่เกี่ยวข้องกับการทำธุรกิจแปลงอ้างอิงโดยปริยายแทนที่จะเป็นบางสิ่งบางอย่างที่ทำให้เกิดแนวคิดทางคณิตศาสตร์ในเชิงตรรกะที่ไม่สามารถอนุญาตให้มีการแปลง (เช่นcontainer<T, stuff>และcontainer<U, other_stuff>เปรียบเทียบได้หากTเปรียบกับU ) มันเป็นแค่ที่common_referenceมีอยู่หรือมีมากกว่านั้น?
Nicol Bolas

มันขาดความคิดที่ว่าฟังก์ชั่นการแปลงเป็นชนิด common_reference เป็น epimorphism
Oliv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.