Dal 2011 abbiamo sia l'assegnazione di copia che quella di spostamento. Tuttavia, this answer argomenta in modo abbastanza convincente che, per le classi di gestione delle risorse, è necessario un solo operatore di assegnazione. Per std::vector
, per esempio, questo potrebbe sembrarePerché std :: vector ha due operatori di assegnazione?
vector& vector::operator=(vector other)
{
swap(other);
return*this;
}
Il punto importante qui è che l'argomento è preso per valore. Ciò significa che al momento dell'inserimento del corpo della funzione, gran parte del lavoro è già stato fatto con la costruzione di other
(se possibile, tramite costruttore di spostamenti, altrimenti con il costruttore di copie). Quindi, questo implementa automaticamente sia l'assegnazione di copia che quella di spostamento in modo corretto.
Se questo è corretto, perché è (secondo this documentation at least) std::vector
non implementato in questo modo?
modifica per spiegare come funziona. Considerare ciò che accade a other
in codice di cui sopra nei seguenti esempi
void foo(std::vector<bar> &&x)
{
auto y=x; // other is copy constructed
auto z=std::move(x); // other is move constructed, no copy is ever made.
// ...
}
I mi sono anche chiesto questo. Copy-and-swap sembra davvero fantastico. Forse è a causa di motivi legacy, che devono mantenere la firma della funzione esattamente la stessa cosa? Sono curioso di vedere una buona risposta. – MicroVirus
Ciò richiede un'allocazione di memoria. La copia dei contenuti da un lvalue non può, se l'assegnatario ha una capacità sufficiente. – juanchopanza
@juanchopanza L'ho pensato anche io. Se è così, allora la bella risposta di GManNickG non è così carina con le serrature? – Walter