Est-il sûr d'affecter un conteneur à l'aide de ses propres itérateurs?

10

Par exemple:

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

Le comportement du code ci-dessus est-il défini? Ou cela conduit à un comportement indéfini?

Artavo
la source

Réponses:

5

Oui. Cette version d'affect est définie comme

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

Contraintes : InputIterator est un type qui se qualifie comme un itérateur d'entrée.

Effets : Équivalent à: return assign (basic_string (first, last, get_allocator ()));

qui montre un calcul temporaire avant que les changements ne se produisent.

AProgrammer
la source
"équivalent à" ne signifie pas qu'un temporaire réel doit être créé. La sémantique doit cependant être la même. Et puisque la version présentée est sûre contre l'auto-affectation, l'implémentation réelle doit l'être aussi.
MSalters
@MSalters. D'accord. J'avais l'intention de commenter cela, puis je me suis perdu en essayant de déterminer quelle partie de l'utilisation de l'allocateur pouvait être éluée.
AProgrammer
Notez que cela est spécifique aux chaînes. Pour, disons, les vecteurs, ce serait UB.
TC
@TC, pourriez-vous citer la norme?
Adler
1
@Adler, consultez ce tableau auquel se réfère la description du vecteur.
AProgrammer