ทำไม std :: span ไม่มีตัวดำเนินการเปรียบเทียบ


10

การstd::spanออกแบบที่ไม่ได้เป็นการอ้างอิงที่มีน้ำหนักเบาไปยัง sub-region ของstd::vector/ std::array/ array แบบธรรมดาหรือไม่? มันควรจะมีตัวดำเนินการเปรียบเทียบใน API ของมันหรือไม่เพื่อให้สอดคล้องกับพวกเขา อะไรคือเหตุผลเบื้องหลังการยกเว้น

หมายเหตุ: โดยผู้ประกอบการเปรียบเทียบผมหมายถึงทั้งชุดเต็ม ( <, <=, ... ) หรือยานอวกาศ<=>


Great IMO คำถามฉันสงสัยเหมือนกัน operator==ก็หายไป Esp สำหรับเวกเตอร์ฉันมักจะสะดวกที่จะเปรียบเทียบโดยตรง อาจเป็นเพราะความยากลำบากอาจเกิดขึ้นกับประเภทการขยายขนาดคงที่แม้ว่าฉันไม่แน่ใจ
darune

ดูเหมือนว่า gsl :: span ซึ่ง std :: span เป็นเวอร์ชันจากยังไม่รวมสิ่งเหล่านี้
darune

1
@DanielLangr ทำไมไม่เปรียบเทียบพจนานุกรมstd::vectorและ std::arrayทำอย่างไร พวกมันถูกกำหนดเช่นเดียวกับประเภทนั้นแล้วทำไมไม่มาที่นี่
Timo

2
โปรดทราบว่าP0122R7เสนอการเปรียบเทียบspanแต่มาตรฐานฉบับปัจจุบันไม่ได้รวมไว้
Daniel Langr

1
@darune gsl::span ทำ (และทำเสมอ) มีตัวดำเนินการเปรียบเทียบ พวกเขาย้ายพวกมันไปที่หัวของ
Barry

คำตอบ:


3

ขณะที่แดเนีย Langr ชี้ให้เห็น , std::spanมีดำเนินการเปรียบเทียบในข้อเสนอครั้งแรกP0122 ผู้ประกอบการเหล่านี้จะถูกลบออกแล้วตั้งแต่ทำงานร่างN4791และเหตุผลที่มีการระบุไว้ในP1085

ในระยะสั้นคัดลอกและ const สำหรับstd::spanคือ "ตื้น" (หมายถึงการคัดลอก a std::spanไม่คัดลอกองค์ประกอบพื้นฐานและ const std::spanไม่ป้องกันองค์ประกอบพื้นฐานจากการแก้ไข) ดังนั้นการเปรียบเทียบถ้ามีอยู่ก็ควรจะ "ตื้น" เพื่อความมั่นคง

กระดาษนั้นให้ตัวอย่างต่อไปนี้:

ตัวอย่างที่ 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

ตัวอย่างที่ 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

การยืนยันในตัวอย่างเหล่านี้อาจล้มเหลวหากT = std::spanไม่เหมาะสำหรับประเภททั่วไป

บางคนอาจโต้แย้งว่าstd::string_viewมีการคัดลอกตื้น แต่การเปรียบเทียบลึก P1085 ยังมีคำอธิบายสำหรับสิ่งนี้:

การจับคู่นี้string_viewแต่string_viewไม่สามารถแก้ไของค์ประกอบที่ชี้ไปและทำให้สำเนาตื้น ๆstring_viewนั้นอาจคล้ายกับการเพิ่มประสิทธิภาพการคัดลอกเมื่อเขียน


โปรดทราบว่าไม่มีสิ่งใดที่จะป้องกันเจ้าของอาเรย์อักขระเพื่อแก้ไขที่เก็บข้อมูลต้นฉบับในขณะที่std::string_viewชี้ไปที่มัน ดังนั้นพูดว่าstd::map<std::span<T>, U>std::map<std::string_view, U>จะเป็นเสียเป็น IMHO std::string_viewไม่ควรมีตัวดำเนินการเปรียบเทียบเช่นกัน
Lyberta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.