3

私は通常、コピースワップイディオムを使用して例外セーフなコピー代入演算子を作成しようとしていますが、ムーブ代入演算子を作成するときに例外を気にする必要があるかどうか疑問に思っていました。コピー代入演算子の例を次に示します。

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 であることに注意してください。回答ありがとうございます。

4

2 に答える 2

5

実際、move コンストラクターが例外をスローする可能性がある場合、例外を保証することは困難または不可能な場合があります。

T標準ライブラリと同じように行うことをお勧めします: move-construction がスローしない場合、特定の操作には例外保証のみがある (または、場合によっては許可される) だけであることを文書化します。オブジェクトをコピーして保証を保証すると、スローされる可能性のある (非常にまれな) 型だけでなく、すべての型の移動代入の利点が失われます。

于 2013-08-29T09:51:00.003 に答える