Копирование / перемещение назначения в std:: vector:: erase() и std:: deque:: erase()



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

561   1  

1 ответ:

на встрече Lenexa вопрос получил непосредственный статус С предложенной резолюцией:

эта формулировка относится к N4296.

изменить 23.3.3.4 [deque.модификаторы] / 5 to:

-5- сложности: количество вызовов деструктора на T это то же самое, что и количество стираемых элементов, но количество вызовов оператора присваивания на T не более чем меньшее число элементов до стираемых элементов и число элементов после стираемых элементов.

изменить 23.3.6.5 [вектор.модификаторы] / 4 to:

-4- сложности: деструктор T называется число раз, равное числу стираемых элементов, но движение оператор присваивания T называется число раз, равное количеству элементов в векторе после стер элементы.

то есть, если резолюция будет принята, не будет никакого специального упоминания о назначении перемещения для std::vector::erase, а также формулировка std::deque::erase будет немного прояснилось.

Comments

    Ничего не найдено.