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


10

Например:

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

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

Ответы:


5

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

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

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

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

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


«эквивалентно» не означает, что фактическое временное должно быть создано. Тем не менее, семантика должна быть одинаковой. И поскольку показанная версия безопасна от самостоятельного назначения, реальная реализация тоже должна быть.
MSalters

@MSalters. согласовано. Я намеревался прокомментировать это, а затем заблудился, пытаясь определить, какая часть использования распределителя может быть исключена.
AProgrammer

Обратите внимание, что это относится к строкам. Для, скажем, векторов, это будет UB.
TC

@TC, не могли бы вы процитировать стандарт?
Адлер

1
@Adler, посмотрите эту таблицу, к которой относится описание вектора.
AProgrammer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.