10

以下はコード スニペットです。

#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以降のバージョンでは後者が出力されます。だから私はオンラインコンパイラが間違っているのか、実際に参照がぶら下がっているのか知りたい.

4

1 に答える 1