右辺値参照の話
きっちり理解していないのですけれど.
prvalueが純粋な右辺値,xvalueがstatic_cast
こちら(参照渡し 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されるので通る }