#c #exception #vector #standards #c 20
Вопрос:
Согласно cppref:
constexpr iterator insert( const_iterator pos, const Tamp; value );
Возвращаемое значение
Итератор, указывающий на вставленное значение.
Сложность
Постоянная плюс линейная величина расстояния между pos и концом контейнера.
Исключения
Если при вставке одного элемента в конце возникает исключение, и значение T равно CopyInsertable или std::is_nothrow_move_constructible::значение равно true, никаких эффектов нет (гарантия строгого исключения).
Если pos
это неверно, в документации четко не описаны следующие проблемы:
- Каково возвращаемое значение?
- Будет ли выдано исключение?
Итак, мой вопрос таков:
А что, если std::vector::insert(pos, value)
с инвалидом pos
?
Комментарии:
1. С помощью vector вы даже не можете проверить, действителен ли pos без UB, так как обычно это необработанный указатель, а сравнение указателей меньше/больше-UB, если указатели не принадлежат одному и тому же объекту или массиву.
2. @dewaffled: Это неопределенное поведение в C, но совершенно не определено
bool
в C .
Ответ №1:
std::vector
представляет собой контейнер последовательности. Таблица 77: Требования к контейнеру последовательности перечисляет первый аргумент каждой insert
перегрузки, p
который определяется непосредственно перед таблицей как : « p
обозначает допустимый итератор константы a
«, где a
вектор.
Таким образом, итератор позиции должен быть допустимым итератором для a
. Если не описано иное последствие, несоблюдение требования функции по умолчанию является неопределенным поведением.
Ответ №2:
(15) Недопустимый итератор-это итератор, который может быть единственным (223)
(223) Это определение применимо к указателям, поскольку указатели являются итераторами. Эффект разыменования итератора, который был признан недействительным, не определен.