我通常(尝试)使用复制交换习语编写异常安全的复制赋值运算符,我想知道在编写移动赋值运算符时是否应该关注异常。以下是复制赋值运算符的示例:
template<class T>
CLArray<T>&
CLArray<T>::operator=( const CLArray& rhs )
{
CLArray tmp( rhs );
std::swap( size_, tmp.size_ );
std::swap( data_, tmp.data_ );
return *this;
}
但是移动任务呢?我的意思是,如果在此移动操作期间在代码中的其他地方抛出异常,我将失去两个对象的状态,对吗?所以我必须先创建一个本地副本,然后删除除新创建的所有内容CLArray
......
template <class T>
CLArray<T>&
CLArray<T>::operator=( CLArray<T>&& rhs )
{
size_ = rhs.size_;
data_ = std::move( rhs.data_ );
return *this;
}
请注意,这data_
是一个 std::vector,感谢您的回答!