функции подкачки для ссылок lvalue и rvalue - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу векторный класс, который имеет конструктор перемещения и оператор присваивания перемещения.Кроме того, у меня есть эта функция подкачки:

template<typename T>
    void vector<T>::swap_( vector& rhs){
        using std::swap;
        swap( m_data, rhs.m_data );
        swap( m_size, rhs.m_size );
        swap( m_capacity, rhs.m_capacity );
    }

Поскольку значения rvalue не связаны с неконстантными ссылками lvalue, мне понадобится идентичная функция подкачки для ссылок rvalue с единственным отличием в типепараметр.Есть ли способ избежать дублирования кода?

1 Ответ

0 голосов
/ 06 февраля 2019

Вам на самом деле не нужна другая версия вашей функции подкачки.В вашем операторе присваивания ходов вы будете иметь подпись, такую ​​как

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);
}
...