เพื่อนร่วมงานต้องการเขียนสิ่งนี้:
std::string_view strip_whitespace(std::string_view sv);
std::string line = "hello ";
line = strip_whitespace(line);
ผมบอกว่ากลับมาstring_view
ทำให้ฉันไม่สบายใจเบื้องต้นและนอกจาก aliasing ที่นี่ดูเหมือน UB ให้ฉัน
ฉันสามารถพูดด้วยความมั่นใจว่าในกรณีนี้จะเทียบเท่ากับline = strip_whitespace(line)
line = std::string_view(line.data(), 5)
ฉันเชื่อว่าจะเรียกstring::operator=(const T&) [with T=string_view]
ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(const T&) [with T=string_view]
ซึ่งถูกกำหนดให้เทียบเท่ากับline.assign(line.data(), 5)
ซึ่งถูกกำหนดให้ทำเช่นนี้:
Preconditions: [s, s + n) is a valid range.
Effects: Replaces the string controlled by *this with a copy of the range [s, s + n).
Returns: *this.
แต่นี่ไม่ได้บอกว่าจะเกิดอะไรขึ้นเมื่อมีนามแฝง
ฉันถามคำถามนี้ใน cpplang Slack เมื่อวานและได้คำตอบที่หลากหลาย ค้นหาคำตอบที่มีสิทธิ์อย่างยิ่งที่นี่และ / หรือการวิเคราะห์เชิงประจักษ์เกี่ยวกับการใช้งานของผู้จำหน่ายห้องสมุดจริง
ผมเขียนกรณีทดสอบสำหรับstring::assign
, vector::assign
, deque::assign
, และlist::assign
forward_list::assign
- Libc ++ ทำให้กรณีทดสอบเหล่านี้ใช้งานได้
- Libstdc ++ ทำให้พวกเขาทำงานทั้งหมดยกเว้น
forward_list
segfaults ใด - ฉันไม่รู้เกี่ยวกับห้องสมุดของ MSVC
segfault ใน libstdc ++ ให้ฉันหวังว่านี่คือ UB; แต่ฉันก็เห็นทั้ง libc ++ และ libstdc ++ ด้วยความพยายามอย่างมากในการทำให้งานนี้เป็นอย่างน้อยในกรณีทั่วไป
*this
นี้จัดสรรกองกำลังของการจัดเก็บที่เกิดขึ้นก่อนการจัดเก็บข้อมูลที่มีอยู่ได้รับอิสระเพื่อให้มีข้อยกเว้นได้รับโยนถ้าจัดสรรล้มเหลวโดยไม่ต้องเปลี่ยน แต่ฉันไม่เห็นอะไรเลยที่จะป้องกันการจัดเก็บที่มีอยู่ถูกนำมาใช้ซ้ำซึ่งในกรณีนี้จะไม่ได้ระบุเนื่องจากความหมายของการคัดลอกการเก็บข้อมูลเกินความเป็นจริง