ขณะที่แดเนีย 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
นั้นอาจคล้ายกับการเพิ่มประสิทธิภาพการคัดลอกเมื่อเขียน
operator==
ก็หายไป Esp สำหรับเวกเตอร์ฉันมักจะสะดวกที่จะเปรียบเทียบโดยตรง อาจเป็นเพราะความยากลำบากอาจเกิดขึ้นกับประเภทการขยายขนาดคงที่แม้ว่าฉันไม่แน่ใจ