Czy przypisanie kontenera jest bezpieczne przy użyciu własnych iteratorów?

10

Jako przykład:

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

Czy zdefiniowano zachowanie powyższego kodu? Czy prowadzi to do nieokreślonego zachowania?

Artavo
źródło

Odpowiedzi:

5

Tak. Ta wersja przypisania jest zdefiniowana jako

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

Ograniczenia : InputIterator to typ, który kwalifikuje się jako iterator wejściowy.

Efekty : Równoważne do: return assign (basic_string (first, last, get_allocator ()));

który pokazuje tymczasowe obliczone przed dokonaniem zmian.

AProgrammer
źródło
„ekwiwalent” nie oznacza, że ​​należy utworzyć rzeczywisty tymczasowy. Jednak semantyka musi być taka sama. A ponieważ pokazana wersja jest bezpieczna przed samodzielnym przypisaniem, rzeczywista implementacja również musi być.
MSalters
@MSalters. Zgoda. Zamierzałem skomentować to, a potem zgubiłem się, próbując ustalić, ile wykorzystania alokatora można uniknąć.
AProgrammer
Zauważ, że jest to specyficzne dla ciągów. Na przykład dla wektorów byłby to UB.
TC
@TC, czy możesz podać standard?
Adler,
1
@Adler, patrz tabela, do której odnosi się opis wektora.
AProgrammer