c – 异常安全移动运算符

c – 异常安全移动运算符,第1张

概述我通常(尝试)使用copy-swap惯用法编写异常安全的复制赋值运算符,我想知道在编写移动分配运算符时是否应该关注异常. 以下是复制分配运算符的示例: template<class T>CLArray<T>&CLArray<T>::operator=( const CLArray& rhs ){ CLArray tmp( rhs ); std::swap( size_, tm 我通常(尝试)使用copy-swap惯用法编写异常安全的复制赋值运算符,我想知道在编写移动分配运算符时是否应该关注异常.
以下是复制分配运算符的示例:

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,谢谢你的答案!

解决方法 实际上,如果移动构造函数可能抛出,则很难或不可能提供异常保证.

我建议像标准库那样做:记录某些 *** 作只有异常保证(或者,在某些情况下,只允许)如果T的移动构造没有抛出.通过复制对象来确保保证会破坏所有类型的移动分配的好处,而不仅仅是可能抛出的(非常罕见的)移动分配的好处.

总结

以上是内存溢出为你收集整理的c – 异常安全移动运算符全部内容,希望文章能够帮你解决c – 异常安全移动运算符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1215359.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存