haraduka's diary

やる気が欲しい

rvalue, lvalueについて

なんだかあまり使わないからすぐに忘れるんですよね。ということで大事なところだけ書いておこう。

まず、rvalueってのは一時的に生成される無名のオブジェクトのこと。lvalueっていうのは実体のある名前付きのオブジェクトのこと。
rvalue referenceというのもある。これは、もう使わないからポインタすげかえちぇばいいや、ってときに使える表現。
rvalue は一時的でそれ以上使わないから、あるオブジェクトをrvalue referenceで受け取ってもらってそのポインタもらっちゃっていいよ~っていう意思表示として使う。
そのrvalue referenceで受け取るというのを表現するのにstd::move()を用いる。

また、argument deducationというのもあり、template void f(T&& t)として、引数にlvalueを渡すと、&&を無視して引数をlvalueとして扱ってくれるとかいう仕様もある。
overload関数の増大を阻止。

最後に、argument deducationゆえに、もしtemplate void f(T&& t)の中でstd::moveなどをしていて、tにlvalueを入れてしまったら大変である。
だから、引数をそのまま、rvalueならrvalue、lvalueならlvalueとして伝搬したいときがあるだろう。そこで使うのがstd::forwardである。

と、肝心なのはこれだけらしい。