¿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?

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.


"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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.