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?

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.


"é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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.