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