TDM-GCC 4.6.1 コンパイラを使用して右辺値参照について実験を行ったところ、理論では説明できない興味深い観察結果が得られました。専門家に説明を手伝ってもらいたいです。
オブジェクトではなく int プリミティブを処理し、foo1 (右辺値参照によってローカル変数を返す) と foo2 (値によってローカル変数を返す) の 2 つの関数を定義した非常に単純なプログラムがあります。
#include <iostream>
using namespace std;
int &&foo1();
int foo2();
int main()
{
int&& variable1 = foo1();
//cout << "My name is softwarelover." << endl;
cout << "variable1 is: " << variable1 << endl; // Prints 5.
cout << "variable1 is: " << variable1 << endl; // Prints 0.
int&& variable2 = foo2();
cout << "variable2 is: " << variable2 << endl; // Prints 5.
cout << "variable2 is still: " << variable2 << endl; // Still prints 5!
return 0;
}
int &&foo1() {
int a = 5;
return static_cast<int&&>(a);
}
int foo2() {
int a = 5;
return a;
}
foo1 によって返され、variable1 によって受信された値は、しばらくすると消滅するようです。おそらく、数ミリ秒の短い期間です。コメントアウトすることで、cout が「My name is softwarelover」と出力しないようにしていることに注意してください。そのステートメントの実行を許可すると、結果は異なります。5, 0 を出力する代わりに、0, 0 を出力します。5 が 0 に変わるのは、"cout << "My name is softwarelover." によって導入された時間遅延が原因のようです。
上記は、関数が値渡しではなく参照によって返されたプリミティブ整数を参照するときに、右辺値参照がどのように動作することになっているのでしょうか? ところで、なぜ0なのか、ゴミではないのか。
variable2 は、c で何度印刷しても消えないように見えることにも注意してください! variable2 は、関数が参照渡しではなく値で返すプリミティブ整数を参照します。
ありがとう。