#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;
}
Co to jest czas życia tymczasowego obiektu zwróconego przez fnc()? Czy jest to okres istnienia "ref" lub tymczasowego odniesienia static_cast (fnc()), który został zniszczony na końcu instrukcji?const odniesienie do tymczasowego odniesienia
Wyjście gcc (żywotność FNC() jest żywotność "ref"):
CL() //global object "cl"
start
CL(const CL&)
end
~CL()
~CL() //global object "cl"
Wyjście VS2013 (dożywotnią z FNC() jest żywotność czasowego odniesienia):
CL() //global object "cl"
start
CL(const CL&)
~CL()
end
~CL() //global object "cl"
Co jest poprawne według standardu?
możliwe duplikat [Gwarantowanych trwania tymczasowej w C++?] (Http://stackoverflow.com/questions/584824/guaranteed-lifetime-of-temporary-in-c) –
prostu zastanawiasz się, co się dzieje, jeśli usunąć 'static_cast <>'? Spodziewałbym się, że oba będą zachowywały się tak samo wtedy, na wypadek, gdybyś miał prawdziwy problem, który chcesz rozwiązać. Jaka jest twoja interpretacja normy dotyczącej tego problemu? –
@UlrichEckhardt "static_cast" to tutaj robi różnicę. Bez tego, czas życia 'fnc()' ma być rozszerzony na czas trwania 'ref'. – Angew