Безопасно ли назначать контейнер, используя свои собственные итераторы?

10

Например:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

Определено ли поведение вышеуказанного кода? Или это приводит к неопределенному поведению?

Artavo
источник

Ответы:

5

Да. Эта версия присвоения определяется как

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

Ограничения : InputIterator - это тип, который квалифицируется как входной итератор.

Эффекты : Эквивалентно: return assign (basic_string (first, last, get_allocator ()));

который показывает временное значение, вычисленное до внесения изменений.

AProgrammer
источник
«эквивалентно» не означает, что фактическое временное должно быть создано. Тем не менее, семантика должна быть одинаковой. И поскольку показанная версия безопасна от самостоятельного назначения, реальная реализация тоже должна быть.
MSalters
@MSalters. согласовано. Я намеревался прокомментировать это, а затем заблудился, пытаясь определить, какая часть использования распределителя может быть исключена.
AProgrammer
Обратите внимание, что это относится к строкам. Для, скажем, векторов, это будет UB.
TC
@TC, не могли бы вы процитировать стандарт?
Адлер
1
@Adler, посмотрите эту таблицу, к которой относится описание вектора.
AProgrammer