В процессе ответа на другой вопрос я наткнулся на несколько иные формулировки для 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 .