今回は"Rvalue reference"(右辺値参照)について。
関数に一時変数(代入演算子の右辺に来る値なので右辺値と呼ばれる)を参照することができると、効率的な実装ができるようになる(らしいです。大体どういうことなのかは理解していると思います)。
しかしながら、現在のC++ではconst &(これを右辺値参照に対して左辺値参照という)でしか渡すことができないため、右辺値なのか、定数のオブジェクトなのか区別できず、またconstで宣言されているので右辺値を変更することができないという欠点があります。
そこで、C++0xでは右辺値参照が導入されます。これにより右辺値が変更可能な状態のまま参照できるようになります。右辺値の型は(型 &&)で記述されるそうです。
例.
class Sample { pubilc: int a; Sample(int x){ a = x; } }; void func(Sample &x) { cout << "Lvalue" << x.a << endl; } void func(Sample &&x) { cout << "Rvalue" << x.a << endl; } int main(int argc, char* argv) { /* Rvalue */ func(Sample(1)); Sample sam = Sample(1); /* Lvalue */ func(sam); return 0; }
またこれにより、"Move semantics"(ムーブセマンティクス)を実装することができるようになるということも利点の一つらしい。
「ムーブセマンティクス」はreturnで返されるようなオブジェクトなどといった、明らかに一時的なオブジェクトを受け取る場合に、それを取り出して代入しなおすのではなく、一時的なオブジェクトを残したまま、そのオブジェクトに取り替えるようにするようにするといったことらしい。
また、引数を右辺値に変えて返す関数std::move()を実装する予定だそうです。
使いこなせるかは微妙ですが、代入処理や一時変数を多用するような処理の場合には効率的なメモリ割り当てのために気にする必要はあるかもしれませんね。うーん、他にも利点があるのか知識不足でわからないのが歯がゆいけれど、今日はここまで。