2

現在、私はScott Meyersの『 Effective Modern C++』という本を読んでいます。

私の誤解は、次の部分(根拠)から来ています。

2 つのコピー操作は独立しています。一方を宣言しても、コンパイラが他方を生成するのを妨げることはありません。したがって、コピー コンストラクターを宣言し、コピー代入演算子を宣言しない場合に、コピー代入を必要とするコードを記述すると、コンパイラによってコピー代入演算子が生成されます。同様に、コピー代入演算子を宣言し、コピー コンストラクターを宣言しない場合でも、コードにコピー構築が必要な場合、コンパイラーはコピー コンストラクターを生成します。これは C++98 でも当てはまり、C++11 でも当てはまります。

2 つの移動操作は独立していません。どちらかを宣言すると、コンパイラはもう一方を生成できなくなります。論理的根拠は、たとえば、クラスの移動コンストラクターを宣言する場合、コンパイラーが生成するデフォルトのメンバーごとの移動とは異なる移動構築の実装方法について何かがあることを示していることです。また、メンバーごとの移動の構築に問題がある場合は、メンバーごとの移動の割り当てにも問題がある可能性があります。したがって、移動コンストラクターを宣言すると、移動代入演算子が生成されなくなり、移動代入演算子を宣言すると、コンパイラーが移動コンストラクターを生成できなくなります。

論理的根拠の部分は、コピー コンストラクターコピー代入演算子のペアにも適用できると思いますね。したがって、コピー コンストラクターを宣言する場合は、既定のメンバーごとのコピーが適切でないことを示します。そして、私がこれを言うなら、おそらくコピー代入演算子もユーザー定義する必要があります。

素晴らしい本だと思いますが、この時点では、この理論的根拠は明確ではありません。これを助けて説明してください。ありがとう。

4

1 に答える 1