| explicitly\implicitly | default ctor | copy ctor | move ctor | dtor | copy assign | move assign |
|---|---|---|---|---|---|---|
| no decl. | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| user-defined ctor | no decl. | ✔ | ✔ | ✔ | ✔ | ✔ |
| default ctor | \ | ✔ | ✔ | ✔ | ✔ | ✔ |
| copy ctor | no decl. | \ | no decl. | ✔ | DEPRECATED | no decl. |
| move ctor | no decl. | deleted | \ | ✔ | deleted | no decl. |
| dtor | ✔ | DEPRECATED | no decl. | \ | DEPRECATED | no decl. |
| copy assign | ✔ | DEPRECATED | no decl. | ✔ | \ | no decl. |
| move assign | ✔ | deleted | no decl. | ✔ | deleted | \ |
方針として:
- いずれかのコンストラクタを定義するなら、デフォルトコンストラクタについて記述しなければならない。
- コピーを記述するなら、ムーブも記述しなければならない。
- ムーブを記述するなら、コピーも記述しなければならない。コピーを禁止する場合も明示したほうが親切だろう。
- コピーまたはムーブコンストラクタを定義するなら、対応する代入も必ず定義しなければならない。
- そのクラスにおける代入が意味論的に異なる(例:ポインタの所有権を扱う)なら、すべてを定義しなければならない。