左值和右值引用的交换函数
swap functions for lvalue and rvalue references
我正在编写一个向量 class,它具有移动构造函数和移动赋值运算符。
除此之外,我还有这个交换功能:
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 );
}
由于右值不与非常量左值引用绑定,我将需要一个相同的右值引用交换函数,唯一的区别在于参数的类型。有什么办法可以避免重复代码吗?
您实际上不需要另一个版本的交换功能。在您的移动赋值运算符中,您将有一个像
这样的签名
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);
}
我正在编写一个向量 class,它具有移动构造函数和移动赋值运算符。 除此之外,我还有这个交换功能:
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 );
}
由于右值不与非常量左值引用绑定,我将需要一个相同的右值引用交换函数,唯一的区别在于参数的类型。有什么办法可以避免重复代码吗?
您实际上不需要另一个版本的交换功能。在您的移动赋值运算符中,您将有一个像
这样的签名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);
}