Обычно я (пытаюсь) писать безопасные для исключений операторы присваивания копий, используя идиому копирования и замены, и мне было интересно, следует ли мне беспокоиться об исключениях при написании операторов присваивания перемещения. Вот пример оператора присваивания копии:
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, и спасибо за ответы!