以下はコード スニペットです。
#include <iostream>
using namespace std;
struct B{
int b;
~B(){cout <<"destruct B" << endl;}
};
B func(){
B b;
b.b = 1;
return b;
}
int main(){
const B& instance = (const B&)func(); //is `instance` a dangling reference?
cout <<instance.b<<endl;
return 0;
}
このオンラインコンパイラでは、出力は
destruct B
destruct B
1
そのため、戻り値はcout
操作よりも早く破棄されるようです。したがって、instance
ぶら下がり参照のようです。
に変更const B& instance = (const B&)func();
する const B& instance =func();
と、結果は
destruct B
1
destruct B
補足として、vs2015でコードをテストすると、出力は最後のものです。ただし、gcc(4.6以前)でテストすると前者が出力され、4.6以降のバージョンでは後者が出力されます。だから私はオンラインコンパイラが間違っているのか、実際に参照がぶら下がっているのか知りたい.