参照の挙動について
sample.cpp
int sum(int a, int b)
{
return a+b;
}
int& temp()
{
return sum(0, 1);
}
int& work()
{
return temp();
}
こういう参照を返すコードがあったとしましょう。
sample.cpp
int main()
{
std::cout << " sum : " << sum(0, 1) << std::endl;
std::cout << "temp : " << temp() << std::endl;
std::cout << "work : " << work() << std::endl;
return 0;
}
このコードは、コンパイルは通ります。
しかし、実行時におかしな挙動をします。
1つ目のsumは、ただ値を返しているだけなので、何も問題はありません。
2つ目のtempも、sumで足し算した値を参照で返しているだけです。
3つ目のworkも、sumで足し算して返された値の参照を参照して(?)返しているだけです。
しかし、C++の参照において、classやstructのメンバなど寿命が長いモノは問題ないのですが、どこかに作られているわけでもないローカル変数(関数の戻り値も含む)を参照で返すのは、非常に危険です。
なぜかというと、ローカル変数がいつ消えてしまうのか予測しづらいからだと思います。
一度だけローカル変数を参照するのは問題なく動きました。(環境やC++のバージョン、コンパイラによって異なるかもしれません)
上記コードのように奥深くから参照を繰り返すと、2~3回参照したあたりで原初のローカル変数がお亡くなりになってしまうのか、初期化していないローカル変数を出力した時などに似ている不定値が返ってきてしまいました。
1
1
// 何らかの不定値