Z tego artykułu na blogu Visual C ++ o referencjach wartości :
... C ++ nie chce, abyś przypadkowo zmodyfikował tymczasowe, ale bezpośrednie wywoływanie funkcji non-const członka na modyfikowalnej wartości jest jawne, więc jest dozwolone ...
Zasadniczo nie powinieneś próbować modyfikować tymczasowych z tego samego powodu, że są to tymczasowe obiekty i umrą teraz. Powodem, dla którego możesz wywoływać metody non-const, jest to, że, no cóż, możesz robić pewne „głupie” rzeczy, o ile wiesz, co robisz i wyrażasz o tym wyraźne zdanie (np. Używając reinterpret_cast). Ale jeśli powiążesz tymczasowe odniesienie z non-const, możesz nadal przesyłać je „na zawsze” tylko po to, aby zniknąć manipulacja obiektem, ponieważ gdzieś po drodze całkowicie zapomniałeś, że to tymczasowe.
Gdybym był tobą, przemyślałbym projekt moich funkcji. Dlaczego g () akceptuje referencje, czy modyfikuje parametr? Jeśli nie, ustaw jako stałe odniesienie, jeśli tak, dlaczego próbujesz przekazać to tymczasowo, czy nie obchodzi cię to, że modyfikujesz tymczasowo? Dlaczego mimo to getx () zwraca tymczasowe? Jeśli podzielisz się z nami swoim prawdziwym scenariuszem i tym, co próbujesz osiągnąć, możesz uzyskać kilka dobrych wskazówek, jak to zrobić.
Sprzeciwianie się językowi i oszukiwanie kompilatora rzadko rozwiązuje problemy - zwykle stwarza problemy.
Edycja: Odpowiadanie na pytania w komentarzu: 1)
X& x = getx().ref(); // OK when will x die?
- Nie wiem i nie obchodzi mnie to, ponieważ właśnie to mam na myśli, mówiąc „przeciw językowi”. Język mówi „tymczasowe umierają na końcu instrukcji, chyba że są zobowiązane do stałej referencji, w którym to przypadku umierają, gdy referencja wykracza poza zakres”. Stosując tę regułę, wydaje się, że x jest już martwy na początku następnej instrukcji, ponieważ nie jest związany z const referen (kompilator nie wie, co zwraca ref ()). To tylko przypuszczenie.
2) Jasno określiłem cel: nie wolno modyfikować tymczasowości, ponieważ to po prostu nie ma sensu (ignorowanie odniesień do wartości C ++ 0x). Pytanie „dlaczego wolno mi dzwonić do członków spoza grupy?” jest dobra, ale nie mam lepszej odpowiedzi niż ta, którą już powiedziałem powyżej.
3) Cóż, jeśli mam rację co do x X& x = getx().ref();
śmierci na końcu oświadczenia, problemy są oczywiste.
W każdym razie, w oparciu o twoje pytanie i komentarze, nie sądzę, że nawet te dodatkowe odpowiedzi cię zadowolą. Oto ostatnia próba / streszczenie: komisja C ++ zdecydowała, że nie ma sensu modyfikować tymczasowości, dlatego nie zezwoliła na wiązanie z odwołaniami innymi niż stałe. Może to dotyczyć implementacji kompilatora lub dotyczyły również problemów historycznych, nie wiem. Potem pojawił się pewien konkretny przypadek i zdecydowano, że wbrew wszelkim przeciwnościom nadal będą one mogły bezpośrednio modyfikować poprzez wywołanie metody non-const. Ale to wyjątek - generalnie nie wolno modyfikować tymczasowych. Tak, C ++ jest często tak dziwny.