c++でムーブコンストラクタを特定の条件下で呼び出したいことがあり、std::move(T&&)
を呼び出すコードを書いた。
しかし、デバッグしてみると対象のムーブコンストラクタが呼び出しされなかった。
暫く悩んだのですが、
この時書いたコードがstd::move(obj)
というコードであり、Obj obj = std::move(obj)
の様に
rvalueの受け入れ先になる変数が存在していないのが原因でした。
std::move(T&&)
は受け入れ先の変数の
ムーブコンストラクタやムーブオペレーターを呼び出すために
特定の変数をrvalueにするための操作でしかないという基本的な理解が抜けていました。
std::move(T&&)
の効果についてはcppreference.comにも書かれています。
std::move は、オブジェクト t からムーブしても構わない、つまり、 t から別のオブジェクトへのリソースの効率的な転送を許可する、ということを示すために使用されます。
特に、 std::move はその引数 t を表す xvalue 式を生成します。 これは右辺値参照型への static_cast と正確に同等です。