
128
6 章 動的変数割り当てを最適化する
Foo(Foo const& rhs) : value_(nullptr) {
if (rhs.value_) {
value_ = std::make_unique<int*>(*rhs.value_);
}
}
};
実際には、コンパイラがムーブコンストラクタとムーブ代入演算子を自動生成するのは、プログ
ラムがコピーコンストラクタ、代入演算子、デストラクタを指定せず
†
、ムーブ演算子がどのメン
バまたは基底クラスでも無効化されていない単純な場合に限られる。この規則は、これらの特別な
関数の定義の存在が(メンバごとのムーブではなく)特別な処理が必要なことを意味するので妥当
なものだ。
ムーブコンストラクタとムーブ代入演算子を開発者が提供せず、コンパイラで自動生成もされな
いとしても、プログラムはコンパイルできる。その場合、コンパイラは効率に劣るコピーコンスト
ラクタと代入演算子を使う。自動生成の規則は非常に複雑なので、すべての特殊関数(デフォルト
コンストラクタ、コピーコンストラクタ、コピー代入演算子、ムーブコンストラクタ、ムーブ代入
演算子、およびデストラクタ)をまとめて、明示的に宣言するか、デフォルト宣言するか、無効に
するのが、開発者の意図を明確にするのでお勧めだ。
6.6.5
ムーブセマンティクスを用いてコードを更新する
ムーブセマンティクスを用いたコード更新は、クラスごとに行う。その処理には次の簡単な
チェックリストが役に立つ。
•
ムーブセマンティクスで効果のある問題を並べる。例えば、コピーコンストラクタとメモリ管 ...