对于左值和右值引用交换功能

问题描述 投票:1回答:1

我在写这具有移动构造函数和移动赋值操作符的向量类。从除了我有这样的交换功能:

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

由于右值不与非const左值引用绑定,我会需要与参数的类型,唯一的区别右值引用相同的交换功能。有没有什么办法可以避免重复的代码?

c++ move-semantics
1个回答
3
投票

你其实并不需要你的交换功能的另一个版本。在您的移动赋值运算符你必须像一个签名

template<typename T>
vector<T>& vector<T>::operator=(vector<T>&& tmp)
{
    // do stuff
}

do stuff部分tmp不再是一个右值。因为它有一个名字,它是一个左值,你可以调用它的交换功能。这意味着实施将

template<typename T>
vector<T>& vector<T>::operator=(vector<T>&& tmp)
{
    swap(tmp);
    return *this;
}

现在你的对象有其他胆量,反之亦然。

你可以做同样的事情与你的移动构造函数。你委托给默认的构造函数,因此新对象得到默认初始化,然后你换的是默认实例到右值。这看起来像

template<typename T>
vector<T>::vector<T>(vector<T>&& tmp) : vector<T>()
{
    swap(tmp);
}
© www.soinside.com 2019 - 2024. All rights reserved.