У процесі відповіді на інше питання я натрапив на дещо інші слова для 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 .