右辺値参照勉強中の副産物

C++0xより導入される右辺値参照とmoveセマンティクスを勉強しているがいまいちわからないorz
簡単に言うと、左辺値は左側にあって恒久的な変数で、右辺値は右側にあって一時的な変数らしく、右辺値参照はその右辺を参照することである・・・らしい。で、関数を作るとき、引数が右辺値かどうかで最適化出来たり出来なかったりするらしいです。右辺値なら一時的なデータなので中を破壊してしまってもいいのでそのことを利用して省メモリにしたり高速化したりするらしいです。
まあとにかくまだよくわかっていませんので詳しいことは別のページに任せます。


で、関連性は殆ど無いけど、似たようなことは戻り値に関しては一部のコンテナとかならできるんじゃないかな?と思ってしまった。

std::vector< int > funct();
//↑vectorを返す関数。中身がとても大きいとする

std::vector< int > val;
val = funct();
//↑戻り値として受け取る場合にコピーが発生する。

上記の例だと大きなコピーが発生するのだが、functの戻り値は一時データなのでまるごとコピーしなくとも中身だけ渡せばパフォーマンスがいいはずである。vectorならどうせ中で持っているのは先頭ポインタと長さぐらいしかないからそれをそのまま渡せば速くなるはずである。
右辺値参照があれば、vectorに右辺値参照で受け取るコンストラクタを実装すれば解決できる・・・はず。で、右辺値参照がない場合は自前でコンストラクタの中身を外で行えばいいんじゃないかな?と思った。

funct().swap( val );
//↑中身を交換する。

swapなら、メモリの確保・削除もなくメモリコピーも発生せずに移動させられる・・・はず。実際にデバッグしてみたら想定していた通りに動いていた。ので一応は使える技では?