しるふぃずむ

どうもプログラマです。好きなものはC#とジンギスカンです。嫌いなものはJava。プログラムおもちろいね。

右辺値参照の話

きっちり理解していないのですけれど.
prvalueが純粋な右辺値,xvalueがstatic_cast(std::moveなども中身はこれのはず)の結果ってことでいいんでしょうかね.
こちら(参照渡し or 値渡し? - yohhoyの日記)を参考に自分でもテスト.
03版
11版

C++11版のop4 [B]で,右辺値参照の変数を返しているのでmoveされてもいいような気がしますが,この場合は普通に値返しされる様子.
引数には名前付き返り値最適化は適用されないんでしょうかね.
std::moveをかませれば期待通り動作します(op5).
op1やop4,5 [A]の動作を見るにローカル変数を返した時の最適化は働いているようです.

値返しをする関数でローカル変数をそのままreturnすると,コピーコンストラクタは呼ばれずrvalue扱いになります.
なのでコピーは禁止だけれどムーブできるオブジェクトを,普通に関数内で生成して返すことができます.

std::unique_ptr<T> Factory(Foo param)		//値返し
{
	std::unique_ptr<T> ret(new T(param));	//ローカルに一時変数
	...
	return ret;				// moveされるので通る
}