Ниже приведен фрагмент кода:
#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.Поэтому я хочу знать, является ли онлайн-компилятор неправильным или ссылка на самом деле свисает.