ในขั้นตอนของการตอบคำถามอื่นฉัน stumbled เมื่อกรมธรรม์ที่แตกต่างกันเล็กน้อยและstd::vector::erase()
std::deque::erase()
นี่คือสิ่งที่ C ++ 14 พูดเกี่ยวกับstd::deque::erase
( [deque.modifiers]/4-6
เน้นของฉัน):
ผลกระทบ: ...
ความซับซ้อน:จำนวนการเรียกใช้ตัวทำลายจะเหมือนกับจำนวนขององค์ประกอบที่ลบ แต่จำนวนการเรียกไปยังตัวดำเนินการกำหนดไม่เกินจำนวนองค์ประกอบที่น้อยกว่าก่อนองค์ประกอบที่ถูกลบและจำนวนองค์ประกอบหลังจาก องค์ประกอบที่ถูกลบ
โยน:
T
ไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ
และนี่คือสิ่งที่กล่าวถึงเกี่ยวกับstd::vector::erase
( [vector.modifiers]/3-5
):
ผลกระทบ: ...
ซับซ้อน: destructor ของ
T
ที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบลบ แต่ผู้ประกอบการที่ได้รับมอบหมายย้ายของT
ที่เรียกว่าจำนวนครั้งที่เท่ากับจำนวนขององค์ประกอบในเวกเตอร์หลังจากองค์ประกอบลบโยน:
T
ไม่มีอะไรเว้นแต่ยกเว้นจะโยนโดยตัวสร้างสำเนาคอนสตรัคย้ายผู้ประกอบการที่ได้รับมอบหมายหรือผู้ประกอบการที่ได้รับมอบหมายย้ายของ
อย่างที่คุณเห็นข้อกำหนดข้อยกเว้นสำหรับทั้งสองอย่างนั้นเหมือนกัน แต่std::vector
มีการกล่าวถึงอย่างชัดเจนว่ามีการเรียกตัวดำเนินการกำหนดย้าย
นอกจากนี้ยังมีความจำเป็นสำหรับการT
ที่จะเป็นMoveAssignable
สำหรับerase()
การทำงานกับทั้งstd::vector
และstd::deque
(ตารางที่ 100) แต่นี่ไม่ได้หมายความถึงการปรากฏตัวของผู้ประกอบการที่ได้รับมอบหมายย้ายหนึ่งสามารถกำหนดผู้ประกอบการที่ได้รับมอบหมายคัดลอกและได้กำหนดดำเนินการกำหนดย้ายและชั้นนี้จะ เป็นMoveAssignable
.
ในกรณีนี้ฉันตรวจสอบด้วย GCC และ Clang และstd::vector::erase()
เรียกตัวดำเนินการคัดลอกการมอบหมายงานหากไม่มีตัวดำเนินการกำหนดย้ายและstd::deque::erase()
ทำแบบเดียวกัน ( DEMO )
คำถามคือ: ฉันพลาดอะไรไปหรือนี่เป็นปัญหา (บรรณาธิการ) ในมาตรฐาน?
ปรับปรุง: ฉันได้ส่งlwg รุ่น #