Como um exemplo:
string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());
O comportamento do código acima está definido? Ou isso leva a um comportamento indefinido?
Sim. Esta versão do assign é definida como
template<class InputIterator> constexpr basic_string& assign(InputIterator first, InputIterator last);
Restrições : InputIterator é um tipo que se qualifica como um iterador de entrada.
Efeitos : Equivalente a: return assign (basic_string (first, last, get_allocator ()));
que mostra um temporário calculado antes que as alterações ocorram.