Originariamente inviato da RooccoXXI
In pratica é l'argomento stesso che viene spostato?
E' il contenuto dell'argomento a essere spostato, ma poi quel contenuto è "annullato". Nel caso di un vector è possibile che venga effettuato un .resize(0);
Se scrivo
é come se invocassi la funzione
codice:
v1.operator=(v2);
e nel caso della move semantics v2 viene letteralmente spostato in v1 e quindi modificato? È per questo che devo togliere il const?
Grazie.
Così però non invochi la move semantics ma la copy semantics.
Corretto è:
codice:
v1 = std::move(v2);
v1.operator=(std::move(v2));
Se non espliciti l'operazione saranno invocati il copy constructor e l'assignment operator.
Le funzioni corrette sono:
codice:
template<typename T>
Vector<T>::Vector(Vector<T>&& V)
: v(std::move(V.v))
{
// opzionale perché ci pensa già il vector
V.v.resize(0);
}
template<typename T>
Vector<T>& Vector<T>::operator=(Vector<T>&& V)
{
if(&V != this)
{
v = std::move(V.v);
// opzionale perché ci pensa già il vector
V.v.resize(0);
}
return *this;
}
//////////////////////////////////////////////////////////////////////////////////////
codice:
template<typename T>
Vector<T> Vector<T>::operator-(const Vector<T>& V) const
{
range_except(V, "");
Vector<T> r(*this);
for(auto i : v) // ???
{
r.v[i] -= V.v[i];
}
return std::move(r);
}
Errare è umano, perseverare è diabolico.