gpt4 book ai didi

c++ - 左值和右值引用的交换函数

转载 作者:行者123 更新时间:2023-11-30 02:16:42 24 4
gpt4 key购买 nike

我正在编写一个 vector 类,它具有 move 构造函数和 move 赋值运算符。除此之外,我还有这个交换功能:

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 左值引用绑定(bind),我将需要一个相同的右值引用交换函数,唯一的区别在于参数的类型。有什么方法可以避免重复代码?

最佳答案

您实际上不需要另一个版本的交换函数。在您的 move 分配运算符中,您将拥有一个签名,如

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 构造函数做同样的事情。您委托(delegate)给默认构造函数,以便您的新对象得到默认初始化,然后将该默认实例交换到右值。看起来像

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

关于c++ - 左值和右值引用的交换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54555189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com