Что делать, если std::вектор::вставка(pos, значение) с недопустимым pos?

#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 это неверно, в документации четко не описаны следующие проблемы:

  1. Каково возвращаемое значение?
  2. Будет ли выдано исключение?

Итак, мой вопрос таков:

А что, если 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

(15) Недопустимый итератор-это итератор, который может быть единственным (223)

(223) Это определение применимо к указателям, поскольку указатели являются итераторами. Эффект разыменования итератора, который был признан недействительным, не определен.