Considerando un codice come questo:È sicuro aggiungere std :: string a se stesso?
std::string str = "abcdef";
const size_t num = 50;
const size_t baselen = str.length();
while (str.length() < num)
str.append(str, 0, baselen);
E 'sicuro di chiamare std::basic_string<T>::append()
su se stesso come questo? La memoria sorgente non può essere invalidata ingrandendo prima dell'operazione di copia?
Non ho trovato nulla nello standard specifico per quel metodo. Dice quanto sopra è equivalente a str.append(str.data(), baselen)
, che a mio avviso potrebbe non essere del tutto sicuro a meno che non vi sia un altro rilevamento di tali casi all'interno di append(const char*, size_t)
.
Ho controllato alcune implementazioni e mi sono sembrate al sicuro in un modo o nell'altro, ma la mia domanda è se questo comportamento è garantito. Per esempio. "Appending std::vector to itself, undefined behavior?" dice che non è per .
Dovrebbe essere ma come te non riesco a trovare nulla in un modo o nell'altro. 'str + = str;' è legale e si riduce alla stessa cosa quindi suppongo che vada bene. – NathanOliver
@NathanOliver: In realtà, c'è una buona ragione per non renderlo illegale. Con le stringhe, allegare la stessa stringa a se stesso o un sottoinsieme della stringa, è ragionevole. Con 'vector', è molto meno probabile. –
@NicolBolas Lo capisco. Non stavo solo trovando gli standard per supportare la mia tesi. Sembra che lo abbia fatto Rakete1111. – NathanOliver