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