次のように記述された代入演算子の潜在的な実装を説明するリンク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&)
自己割り当てテストに合格するために十分なチェックが行われることを確認するために、子クラスの実装者になることを示します。