В процессе ответа на еще один вопрос я наткнулся на несколько разные формулировки для std::vector::erase()
и std::deque::erase()
.
Вот что говорит С++ 14 о std::deque::erase
([deque.modifiers]/4-6
, мой удар):
Эффекты:...
Сложность: количество вызовов деструктора совпадает с количеством стираемых элементов, но Количество вызовов оператора присваивания не больше, чем меньшее количество элементов Перед стираемыми элементами и количеством элементов после стираемых элементов.
Throws: Nothing, если исключение генерирует конструктор копирования, перемещает конструктор, оператор присваивания или оператор присваивания перемещения
T
.
И вот что он говорит о std::vector::erase
([vector.modifiers]/3-5
):
Эффекты:...
Сложность: деструктор
T
называется числом раз, равным количеству стираемых элементов, но оператор присваиванияT
называется числом раз, равным количество элементов в векторе после стираемых элементов.Throws: Nothing, если исключение генерирует конструктор копирования, перемещает конструктор, оператор присваивания или оператор присваивания перемещения
T
.
Как вы можете видеть, спецификации исключений для обоих из них одинаковы, но для std::vector
он явно упоминает, что оператор присваивания перемещения вызывается.
Также для T
требуется MoveAssignable
для erase()
работать как с std::vector
, так и с std::deque
(таблица 100), но это не означает наличие оператора присваивания перемещения: один может определять оператор присваивания копий, а не определять оператор присваивания перемещения, а этот класс будет MoveAssignable
.
На всякий случай, я проверил с GCC и Clang, и действительно std::vector::erase()
вызывает оператор присваивания копии, если нет оператора присваивания перемещения, а std::deque::erase()
делает то же самое (DEMO).
Итак, вопрос: я что-то пропустил, или это (редакционная) проблема в стандарте?
Update: Я отправил LWG issue # 2477.