
|
159
5 章
右辺値参照、ムーブセマンティクス、完全転送
右辺値参照、ムーブセマンティクス、完全転送に初めて出会った時のことを思い出してみてくだ
さい。ムーブセマンティクスと完全転送はきわめて直観的で分かりやすいと感じませんでしたか。
•
ムーブセマンティクス
コンパイラによる、コスト高なコピー演算のコスト安なムーブ演算への置き換えを可能にす
る。コピーコンストラクタ、コピー代入演算子がオブジェクトのコピーを制御するのと同様
に、ムーブコンストラクタ、ムーブ代入演算子はオブジェクトのムーブセマンティクスを制御
する。また、ムーブセマンティクスからは std::unique_ptr、std::future、std::thread
などのムーブ専用型も生み出される。
•
完全転送
任意の実引数をとり、他の関数へ転送する関数テンプレートの記述を可能にする。転送先関
数は完全に同じ実引数を直接受け取ったかのように動作する。
右辺値参照は、独立した機能と言うよりも、上記 2 つの機能をつなぎ合わせる糊の役割を果たす、
ムーブセマンティクスと完全転送を実現するための言語機能です。
この 3 つの機能の経験を積むにつれ、当初抱いた印象は氷山の一角に過ぎなかったと実感するで
しょう。右辺値参照、ムーブセマンティクス、完全転送の世界には、見た目以上に微妙な差異が隠
れています。例えば、std::move は実際には何もムーブしませんし、完全転送は不完全なものです。
ムーブ演算が常にコピー演算よりもコスト安という訳でもなく、コスト安に ...