È sicuro assegnare un contenitore usando i propri iteratori?


10

Come esempio:

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

Il comportamento del codice sopra è definito? O porta a comportamenti indefiniti?

Risposte:


5

Sì. Questa versione di assegnazione è definita come

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

Vincoli : InputIterator è un tipo che si qualifica come iteratore di input.

Effetti : equivalente a: return assegnato (basic_string (first, last, get_allocator ()));

che mostra un calcolo temporaneo prima che avvengano le modifiche.


"equivalente a" non significa che deve essere creato un temporaneo effettivo. La semantica deve essere la stessa, però. E poiché la versione mostrata è sicura contro l'autoassegnazione, anche l'implementazione effettiva deve esserlo.
Salterio

@MSalters. concordato. Intendevo commentare ciò, poi mi sono perso nel tentativo di determinare la quantità di utilizzo dell'allocatore che poteva essere elusa.
AProgrammer

Si noti che questo è specifico per le stringhe. Perché, diciamo, vettori, sarebbe UB.
TC

@TC, potresti citare lo standard?
Adler,

1
@Adler, vedere questa tabella a cui fa riferimento la descrizione del vettore.
AProgrammer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.