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