「コピーコンストラクタ&代入演算子」と「ムーブコンストラクタ&ムーブ代入演算子」を区別できるようになったので、感動のあまりメモします。
- ムーブコンストラクタがあるとSTLコンテナの
push_backとstd::moveで譲渡によるコピーと想定外のデストラクタ呼び出し回避が可能です。 - コピーコンストラクタ(const参照のコピーコンストラクタ)はコピーのコストがありますが、ムーブコンストラクタはありません。
| C++の特別なコンストラクタ | 構文 | 概要 |
|---|---|---|
| デフォルトコンストラクタ | Class() |
引数なし。 |
| コピーコンストラクタ(const参照) | Class(const Class& r) |
元のオブジェクトは変更されないのでconst。 |
| ムーブコンストラクタ | Class(Class&& r) |
元のオブジェクトは移譲されるので非const。初期化時にstd::moveを与えることで呼び出せる。 |
| C++の代入演算子オーバーロード | 構文 | 概要 |
|---|---|---|
| (コピー)代入演算子(const参照) | Class& operator=(const Class& r) |
元のオブジェクトは変更されないのでconst。 |
| ムーブ代入演算子 | Class& operator=(Class&& r) |
元のオブジェクトは移譲されるので非const。 |
より詳しく分かりやすい情報源:
右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス