É seguro atribuir um contêiner usando seus próprios iteradores?

10

Como um exemplo:

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

O comportamento do código acima está definido? Ou isso leva a um comportamento indefinido?

Artavo
fonte

Respostas:

5

Sim. Esta versão do assign é definida como

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

Restrições : InputIterator é um tipo que se qualifica como um iterador de entrada.

Efeitos : Equivalente a: return assign (basic_string (first, last, get_allocator ()));

que mostra um temporário calculado antes que as alterações ocorram.

AProgrammer
fonte
"equivalente a" não significa que um temporário real precise ser criado. A semântica deve ser a mesma, no entanto. E como a versão mostrada é segura contra auto-atribuição, a implementação real também deve ser.
precisa saber é o seguinte
@MSalters. acordado. Eu pretendia comentar sobre isso e depois me perdi na tentativa de determinar quanto do uso do alocador poderia ser evitado.
precisa saber é o seguinte
Observe que isso é específico para seqüências de caracteres. Para, digamos, vetores, seria UB.
TC
@TC, você poderia citar o padrão?
Adler
11
@ Adler, veja esta tabela à qual a descrição do vetor se refere.
precisa saber é o seguinte