Вам на самом деле не нужна другая версия вашей функции подкачки.В вашем операторе присваивания ходов вы будете иметь подпись, такую как
template<typename T>
vector<T>& vector<T>::operator=(vector<T>&& tmp)
{
// do stuff
}
в do stuff
part tmp
больше не является значением.Поскольку у него есть имя, оно является lvalue, и вы можете вызывать на нем свою функцию подкачки.Это означает, что реализация будет
template<typename T>
vector<T>& vector<T>::operator=(vector<T>&& tmp)
{
swap(tmp);
return *this;
}
, и теперь у вашего объекта есть другие силы и наоборот.
Вы можете сделать то же самое с вашим конструктором перемещения.Вы делегируете конструктору по умолчанию, чтобы ваш новый объект был инициализирован по умолчанию, а затем вы меняете этот экземпляр по умолчанию в rvalue.Это выглядит как
template<typename T>
vector<T>::vector<T>(vector<T>&& tmp) : vector<T>()
{
swap(tmp);
}