ฉันกำลังดูมาตรฐาน C++ ที่ N3485 25.3.1 [alg.copy] ซึ่งกำหนดอัลกอริธึม 4 แบบ:
copy
copy_backward
copy_if
copy_n
ในคำอธิบายสำหรับ copy
มีหมายเหตุ 25.3.1 [alg.copy]/3 นี้:
ต้องการ: ผลลัพธ์จะต้องไม่อยู่ในช่วง [แรก, สุดท้าย)
นั่นคือ copy
ทำงานไม่ถูกต้องเสมอไปเมื่อช่วงทับซ้อนกัน (คล้ายกับ memcpy
)
copy_backward
และ copy_if
มีภาษาที่คล้ายกันซึ่งห้ามไม่ให้มีช่วงที่ทับซ้อนกัน (25.3.1 [alg.copy]/14 และ 25.3.1 [alg.copy]/8 ตามลำดับ)
อย่างไรก็ตาม ไม่มีข้อห้ามดังกล่าวสำหรับ copy_n
และไม่มี copy_n_backward
นี่หมายความว่า copy_n
ทำสิ่งที่ถูกต้องเมื่อช่วงคาบเกี่ยวกันใช่หรือไม่
(การใช้งาน copy_n
ของ MSVC++ ดูเหมือนจะมอบสิทธิ์ให้กับ std::memmove
ดังนั้นฉันรู้ว่ามันปลอดภัยที่นี่ใน MSVC++ 2013 แต่ฉันไม่ต้องการพึ่งพาสิ่งนี้หากมาตรฐานบอกเป็นอย่างอื่น)
copy_n
ของ MSVC++ ดูเหมือนจะมอบสิทธิ์ให้กับstd::memmove
โปรดทราบว่าเราทำสิ่งนี้เฉพาะเมื่อการเปลี่ยนแปลงนั้นถูกต้องเท่านั้น นั่นคือ โดยที่ตัววนซ้ำเป็นตัวชี้ไปยังอ็อบเจ็กต์ที่สามารถคัดลอกได้เล็กน้อย - person James McNellis   schedule 23.12.2013std::list
ตัววนซ้ำ มันจะไม่ปลอดภัยในการใช้งานของ MSVC++ ฟังดูเหมือนเป็นคำตอบสำหรับฉัน... - person Billy ONeal   schedule 23.12.2013copy_n
ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงไม่อยู่ในมาตรฐาน คุณสามารถส่งปัญหาได้ BTW,copy
ห้ามเฉพาะการทับซ้อนกันซึ่งเอาต์พุต เริ่มต้น ในช่วงอินพุต แต่จะทำงานได้ดีเมื่อช่วงเอาต์พุต สิ้นสุด อยู่ในช่วงอินพุต (เช่น การคัดลอกไปทางซ้าย) - person TemplateRex   schedule 04.01.2014