なぜこれが正しいのか不思議です。戻り値は参照型int&
ですが、h()
関数int
は文中の値型を返しますreturn x
。int
では、戻り値はどのようにに変化するのint &
でしょうか?
これはコード スニペットで、C++ コンパイラで正常にコンパイルされます。
int& h() {
int q;
static int x;
return x;
}
これは static への参照を返しますint
。はx
、関数h
が最初に呼び出されたときに初期化されます。次のように使用します。
int& href = h();
++href; // increments the static variable
int& href2 = h(); // another reference to the same static variable
変数q
は何の効果もないはずであり、疑わしいと思います。
The reference means that you're actually returning effectively the same variable so changing the value of what was returned will directly alter the value of x
If the code had been writtten:
int h()
{
int q;
static int x;
return x;
}
(i.e. not be reference) then you'd be returning a copy of the value of x
(although you should to be fair check out Return Value Optimization.) Returning a reference is efficient, however, there are times (multi-threading being an obvious example) where it can be undesirable and confusing.
int&
intへの参照です。x
は整数です。したがってreturn x;
、 を返す関数からint&
への参照が返されますx
。
また:
関数の終了時にローカル変数が破棄されるため、ローカル変数への参照を返すことは危険です。参照を取得するまでに、それが参照するものは存在しません。これはダングリング参照と呼ばれ、何も指していないポインターのようなものです。
静的変数はローカル変数ではなく、関数が終了しても破棄されません。したがって、参照は取得時に有効なオブジェクトを指しています。