Skąd wzorzec nie stały nie może wiązać się z obiektem tymczasowym?
Dlaczego nie można uzyskać nie-stałych odniesień do tymczasowego obiektu, który działagetx()
wraca? Oczywiście jest to zabronione przez C ++ Standard, ale interesuje mnie cel takiego ograniczenia,nie odniesienie do standardu.
struct X
{
X& ref() { return *this; }
};
X getx() { return X();}
void g(X & x) {}
int f()
{
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;
}
Jasne jest, że czas życia obiektu nie może być przyczyną, ponieważ jest to stałe odniesienie do obiektunie jest zabronione przez C ++ Standard.Jasne jest, że tymczasowy obiekt nie jest stały w powyższym przykładzie, ponieważ dozwolone są wywołania funkcji innych niż stałe. Na przykład,ref()
może zmodyfikować tymczasowy obiekt.Dodatkowo,ref()
pozwala oszukać kompilator i uzyskać link do tego tymczasowego obiektu, co rozwiązuje nasz problem.Dodatkowo:
Mówią, że „przypisanie tymczasowego obiektu do referencji stałej wydłuża czas życia tego obiektu”, a „Nic nie mówi się o referencjach niekonstentnych”. Mójdodatkowe pytanie. Czy następujące przypisanie wydłuża czas życia obiektu tymczasowego?
X& x = getx().ref(); // OK