ブログにまとめるのが面倒くさいのでメモ。std::move
は必ずしも「ムーブ」を強制せず、無条件(unconditionally) rvalueキャストを行う。
http://scottmeyers.blogspot.jp/2012/11/on-superfluousness-of-stdmove.html
http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler
##例外ケース1
ムーブコンストラクタ/代入演算子を提供しないクラス。コピー動作にフォールバックする。
struct X {
X(const X&) = default;
// ムーブコンストラクタなし
};
X v0;
X v1(std::move(v0)); // コピー
##例外ケース2
constオブジェクトからのムーブは行われず、コピー動作にフォールバックする。(一般に、ムーブコンストラクタ/代入演算子は非const rvalue参照型X&&
を引数にとり、コピーコンストラクタ/代入演算子はconst lvalue参照型const X&
を引数にとるため。)
struct X {
X(const X&) = default;
X(X&&) = default;
};
void fuunc(const X arg) {
X v(std::move(arg)); // コピー
}