加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 异常安全移动运算符

发布时间:2020-12-16 09:47:09 所属栏目:百科 来源:网络整理
导读:我通常(尝试)使用copy-swap惯用法编写异常安全的复制赋值运算符,我想知道在编写移动分配运算符时是否应该关注异常. 以下是复制分配运算符的示例: templateclass TCLArrayTCLArrayT::operator=( const CLArray rhs ){ CLArray tmp( rhs ); std::swap( size_,
我通常(尝试)使用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的移动构造没有抛出.通过复制对象来确保保证会破坏所有类型的移动分配的好处,而不仅仅是可能抛出的(非常罕见的)移动分配的好处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读