C++0xで登場するはずの、右辺値参照です。
コーディングスタイルが一気に変わりそうな、なかなか面白い構文です。
とりあえず、配列を求める関数を作ってみようと思います。
本来なら素数だったり、3の倍数と3の付く数だったりしますが、
今回は単純に友達a以上恋人b未満の整数を返す関数を作ります。
まずは、C#で書いてみます。
int [] foo(int a, int b){
int length = b - a;
int [] ret = new int[length];
for(int n = 0; n < length; n++){
ret[n] = n + a;
}
return ret;
}
これをそのままC++で書いてみます。
int * foo(int a, int b){
int length = b - a;
int *ret = new int[length];
for(int n = 0; n < length; n++){
ret[n] = n + a;
}
return ret;
}
ただC++の構文に置き換えただけなのに大問題のプログラムです。
問題は2つ
・配列の大きさがわからない
・deleteを相手任せ
これを回避する方法はいくつかありますが、今回はvectorを使ってみようと思います。
void foo(int a, int b, vector<int> &ret){
int length = b - a;
for(int n = 0; n < length; n++){
ret.push_back(n + a);
}
}
出来たのはいいんですけど、この方法だとどうやっても返り値にはできません。
それを返り値に見せかけるように記述出来るのが右辺値参照です。
今までの構文だと、返り値は必ずコピーになるので、
巨大な構造体のようなものを返り値にするのは抵抗がありました。
関数のアウトプットは原則返り値で返す、という決め事になれば、
インプット/アウトプットがわかりやすくなりそうです。
#ここまで書いたが、もう どーにも続かない