การกำหนดคอนเทนเนอร์โดยใช้ตัววนซ้ำของตนเองปลอดภัยหรือไม่?


10

ตัวอย่างเช่น:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

มีการกำหนดพฤติกรรมของรหัสข้างต้นหรือไม่ หรือมันนำไปสู่พฤติกรรมที่ไม่ได้กำหนด?

คำตอบ:


5

ใช่. การกำหนดเวอร์ชันนี้ถูกกำหนดเป็น

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

ข้อ จำกัด : InputIterator เป็นประเภทที่มีคุณสมบัติเป็นตัววนซ้ำอินพุต

ผลกระทบ : เทียบเท่ากับ: return มอบหมาย (basic_string (แรก, สุดท้าย, get_allocator ()));

ซึ่งแสดงการคำนวณชั่วคราวก่อนการเปลี่ยนแปลงที่เกิดขึ้น


"เทียบเท่ากับ" ไม่ได้หมายความว่าจะต้องสร้างจริงชั่วคราว ความหมายจะต้องเหมือนกัน และเนื่องจากเวอร์ชันที่แสดงมีความปลอดภัยต่อการมอบหมายด้วยตนเองการใช้งานจริงจึงต้องมีเช่นกัน
MSalters

@MSalters ตกลง ฉันตั้งใจจะให้ความเห็นเกี่ยวกับสิ่งนั้นจากนั้นก็หายไปในความพยายามที่จะกำหนดจำนวนการใช้งานตัวจัดสรรที่อาจถูกลบออก
AProgrammer

โปรดทราบว่านี่เป็นสตริงเฉพาะ สำหรับพูดเวกเตอร์มันจะเป็น UB
TC

@TC คุณสามารถพูดมาตรฐานได้หรือไม่
Adler

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