У процесі відповіді на інше питання я натрапив на дещо інші слова для std::vector::erase()і std::deque::erase().
Ось що говорить C ++ 14 про std::deque::erase( [deque.modifiers]/4-6, моє наголос):
Ефекти: ...
Складність: кількість викликів до деструктора така ж, як кількість стираних елементів, але кількість викликів оператору призначення не більше меншої кількості елементів до стираних елементів та кількості елементів після стираються елементи.
Кидки: Нічого, якщо конструктор копій, конструктор переміщення, оператор присвоєння або оператор присвоєння оператора присвоєння не видасть виняток
T.
А ось що говорить про std::vector::erase( [vector.modifiers]/3-5):
Ефекти: ...
Складність: Деструкція
Tназивається число раз , дорівнює кількості елементів стертих, але оператор присвоювання перехід зTназивається число раз , дорівнює кількості елементів у векторі після стертих елементів.Кидки: Нічого, якщо конструктор копій, конструктор переміщення, оператор присвоєння або оператор присвоєння оператора присвоєння не видасть виняток
T.
Як бачимо, специфікації виключень для обох є однаковими, але для std::vectorних прямо вказано, що оператор присвоєння переміщення викликається.
Існує також вимога Tбути MoveAssignableдля erase()роботи з обома std::vectorта std::deque(Таблиця 100), але це не означає наявність оператора присвоєння переміщення: можна визначити оператора призначення копії, а не визначити оператора призначення переміщення, і цей клас буде бути MoveAssignable.
На всяк випадок я перевірив у GCC та Clang і дійсно std::vector::erase()викликає оператора присвоєння копії, якщо немає оператора присвоєння переміщення, і std::deque::erase()робить те саме ( DEMO ).
Тож питання: чи я щось пропустив, чи це (редакційна) проблема в стандарті?
Оновлення: я надсилав випуск LWG №2477 .