「コピーコンストラクタ&代入演算子」と「ムーブコンストラクタ&ムーブ代入演算子」を区別できるようになったので、感動のあまりメモします。
- ムーブコンストラクタがあると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++日本語リファレンス