#include <iostream>
using namespace std;
struct CL
{
CL()
{
cout<<"CL()"<<endl;
}
CL(const CL&)
{
cout<<"CL(const CL&)"<<endl;
}
~CL()
{
cout<<"~CL()"<<endl;
}
};
CL cl;
CL fnc()
{
return cl;
}
int main() {
cout<<"start"<<endl;
const CL& ref=static_cast<const CL&>(fnc());
//...Is "ref" valid here??
cout<<"end"<<endl;
return 0;
}
Qual è la durata dell'oggetto temporaneo restituito da fnc()? E 'la vita di "ref" o di riferimento temporaneo static_cast (fnc()), che ha distrutto alla fine dell'istruzione?const riferimento a riferimento temporaneo
uscita di gcc (vita di FNC() è la vita di "ref"):
CL() //global object "cl"
start
CL(const CL&)
end
~CL()
~CL() //global object "cl"
uscita di VS2013 (vita di FNC() è la vita di riferimento temporaneo):
CL() //global object "cl"
start
CL(const CL&)
~CL()
end
~CL() //global object "cl"
Che cosa è corretto per Standard?
possibile duplicato del [Durata garantita delle temporanea in C++?] (Http://stackoverflow.com/questions/584824/guaranteed-lifetime-of-temporary-in-c) –
Chiedo solo, cosa succede se si rimuovere il 'static_cast <>'? Mi aspetterei che entrambi si comportino allo stesso modo, nel caso in cui tu abbia un problema reale che vuoi risolvere. Inoltre, qual è la tua interpretazione dello standard riguardante questo problema? –
@UlrichEckhardt Il 'static_cast' è ciò che fa la differenza qui. Senza di esso, la durata di 'fnc()' è garantita per essere estesa a quella di 'ref'. – Angew