Копирование / перемещение назначения в 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.
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