13

コピーアンドスワップのイディオムについてこれを読んだ、(2) の下にあるこれを読みました。

class_name & class_name :: operator= ( const class_name & )     (2)     

(2) コピーアンドスワップの慣用句が使えない場合の代表的なコピー代入演算子の宣言

コピー アンド スワップ イディオムの使用を避ける必要があるのはどのような場合ですか?

そして、それが完全に「使用できない」場合は?

コピーアンドスワップとゼロのルールの両方が適用されない実際のケースはありますか?

この質問を見つけましたが、具体的すぎて、そのようなケースを特定する方法に関するガイドラインが含まれていませんでした.

4

2 に答える 2

7

コピー アンド スワップ イディオムの使用を避ける必要があるのはどのような場合ですか?

ナイーブ コピーが安全で、より高速であることを証明できる場合swap

オブジェクトを所有するメンバー ポインター (スマートでも生でもない) がなく、すべてのメンバー オブジェクトに同じことが当てはまる場合を特定できます。

そして、それが完全に「使用できない」場合は?

タイプが swappable でない場合、コピー アンドスワップは使用できません。

swapスワップ可能にするには、型が移動構築可能かつ移動代入可能であるか、メンバー関数またはフレンド関数を定義している必要があります。

于 2015-11-16T12:19:48.827 に答える
2

次のように記述された代入演算子の潜在的な実装を説明するリンクclass_name& class_name::operator=(class_name)

コピー アンド スワップ イディオムを使用できる場合のコピー代入演算子の典型的な宣言

そしてclass_name& class_name::operator=(const class_name&)次のように:

コピー アンド スワップ イディオムが使用できない場合のコピー代入演算子の典型的な宣言

基本的に、リンクされた質問への優れた回答に記載されているように、自己割り当てテストに合格するため、可能な場合は常にコピーアンドスワップを使用したいと考えています。

では、問題は、なぜhttp://www.cppreference.comで言及されている規則なのかということです。

仮想クラスにコピー コンストラクターを実装しているとしましょう。継承する人には、コピー アンド スワップ イディオムを使用する必要があることを明確にしたいと思います。どうすればいいですか?最初の呼び出しでコピーを行うことで、彼らを助けることができます。

class_name& class_name::operator=(class_name)

これは値によるコピーであるため、子クラスの実装者は、子クラスのコピーが既に作成されていることを認識し、スワップするだけで済みます。

ここで、class_nameコピー構築できないメンバーを含む があった場合、たとえばクラスにコピー構築できないような がある場合はどうなるでしょうかunique_ptr。代入演算子に値引数によるコピーを作成しないことで、それを示すことができます。次に例を示します。

class_name& class_name::operator(const class_name&)

自己割り当てテストに合格するために十分なチェックが行われることを確認するために、子クラスの実装者になることを示します。

于 2015-11-16T12:23:27.717 に答える