2014-12-09 25 views
5

Dato questo esempio:Riutilizza uno std :: string spostato?

std::vector<std::string> split(const std::string& str) { 
    std::vector<std::string> result; 
    std::string curr; 
    for (auto c : str) { 
     if (c == DELIMITER) { 
      result.push_back(std::move(curr)); // ATTENTION HERE! 
     } else { 
      curr.push_back(c); 
     } 
    } 
    result.push_back(std::move(curr)); 
    return result; 
} 

Posso riutilizzare la curr std: string? Questo frammento sembra funzionare: dopo curr viene spostato all'interno del vettore result, diventa vuoto. Voglio essere sicuro che questo non è un comportamento indefinito nello standard e non funziona solo a causa della fortuna.

+4

è lasciato in uno stato valido, ma non specificato. Non è garantito che sia vuoto. –

+0

Penso che la differenza qui sia sottile, ad esempio: ottimizzazione delle stringhe piccole –

risposta

10

Con alcune eccezioni (puntatori intelligenti, ad esempio), gli oggetti spostati vengono lasciati in uno stato valido ma non specificato.

In un std::string che utilizza l'ottimizzazione della stringa piccola, ad esempio, se la stringa è piccola, non c'è allocazione dinamica e una mossa è una copia. In tal caso è perfettamente valido che l'implementazione lasci intatta la stringa di origine e non incida sul costo aggiuntivo dello svuotamento della stringa.

3

Da http://en.cppreference.com/w/cpp/utility/move

... tutte le funzioni della libreria standard che accettano i parametri di riferimento rvalue (come std :: vector :: push_back) sono garantiti per lasciare il mosso-da argomento a stato valido, ma non specificato.

1

Può essere, questa link sarà utile

Insomma, per il riutilizzo è necessario chiamare il metodo .clear

+3

Non è necessario _need_ per chiamare 'clear()'. Puoi semplicemente assegnarlo, ridimensionarlo o qualsiasi altra operazione senza precondizioni. –