交换左值和右值引用的函数

时间:2019-02-06 13:50:32

标签: c++ move-semantics

我正在编写一个具有移动构造函数和移动赋值运算符的向量类。 除此之外,我还具有以下交换功能:

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

由于右值不与非常量左值引用绑定,因此我将需要一个完全相同的交换函数用于右值引用,但参数类型的唯一区别是。有什么办法可以避免重复代码?

1 个答案:

答案 0 :(得分: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;
}

现在您的对象具有其他优点,反之亦然。

您可以使用move构造函数执行相同的操作。您将委派给默认构造函数,以便对新对象进行默认初始化,然后将该默认实例交换到右值中。看起来像

template<typename T>
vector<T>::vector<T>(vector<T>&& tmp) : vector<T>()
{
    swap(tmp);
}