¿Es seguro asignar un contenedor usando sus propios iteradores?

10

Como ejemplo:

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

¿Está definido el comportamiento del código anterior? ¿O conduce a un comportamiento indefinido?

Artavo
fuente

Respuestas:

5

Si. Esta versión de asignar se define como

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

Restricciones : InputIterator es un tipo que califica como un iterador de entrada.

Efectos : Equivalente a: return asignar (basic_string (first, last, get_allocator ()));

que muestra un cálculo temporal antes de que tengan lugar los cambios.

Un programador
fuente
"equivalente a" no significa que se deba crear un temporal real. Sin embargo, la semántica debe ser la misma. Y dado que la versión que se muestra es segura contra la autoasignación, la implementación real también debe serlo.
MSalters
@MSalters. convenido. Tenía la intención de comentar sobre eso y luego me perdí al tratar de determinar cuánto del uso del asignador podría eludirse.
Programador del
Tenga en cuenta que esto es específico de las cadenas. Para, digamos, vectores, sería UB.
TC
@TC, ¿podría citar el estándar?
Adler
1
@ Adler, consulte esta tabla a la que se refiere la descripción del vector.
Programador del