gpt4 book ai didi

c++ - 异常安全 move 运算符

转载 作者:太空狗 更新时间:2023-10-29 20:13:59 26 4
gpt4 key购买 nike

我通常(尝试)使用复制交换惯用语编写异常安全复制赋值运算符,我想知道在编写 move 赋值运算符时是否应该关注异常。这是复制赋值运算符的示例:

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;
}

但是 move 分配呢?我的意思是,如果在这个 move 操作期间代码中的其他地方抛出异常,我将失去两个对象的状态,对吧?所以我必须先创建一个本地拷贝,然后删除除新创建的 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,感谢您的回答!

最佳答案

事实上,如果 move 构造函数可能抛出异常,则很难或不可能提供异常保证。

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

关于c++ - 异常安全 move 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507190/

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