2012-01-06 11 views
6

Używam this tutorial, ale kiedy mogę skompilować kod z nią:Jak obejść ostrzeżenie "rvalue used as lvalue"?

D3DXMatrixLookAtLH(
    &matView, 
    &D3DXVECTOR3(0.0f, 10.0f, 0.0f), // warning C4238 
    &D3DXVECTOR3(0.0f, 0.0f, 0.0f), // warning C4238 
    &D3DXVECTOR3(0.0f, 0.0f, 1.0f) // warning C4238 
); 

uzyskać:

ostrzeżenie C4238: niestandardowe rozszerzenia używane: class rvalue używany jako lwartości

Jaki jest właściwy (bez ostrzeżenia) sposób wykonania tej czynności bez dodatkowych linii kodu?

Zastanawiam się również, co jest takiego złego w tym wierszu kodu? Dlaczego daje ostrzeżenie, jeśli działa dobrze? Czy to ...?

+1

Faktem jest, że nie można przyjąć adresu tymczasowego (rwartości). 'operator &' * potrzebuje * wartość l. Ostrzeżenie prawidłowo to podkreśla. Jednak praktycznie rzecz biorąc, kod jest w porządku, ponieważ tymczasowe będą działać do końca pełnego wyrażenia (wywołanie funkcji). – Xeo

+2

Daje ostrzeżenie, ponieważ kod nie jest przenośny. Twój kompilator ma niestandardowe rozszerzenie, które na to pozwala; inne kompilatory mogą go odrzucić. –

+0

Złe jest to, że następnym razem przypadkowo sprawisz, że 'matView' będzie tymczasowy. – lapk

Odpowiedz

15

Podajesz adres tymczasowego. Nie możesz tego zrobić. Zadeklarować swój wektory wcześniej:

D3DXVECTOR3 a(0.0f, 10.0f, 0.0f) 
      ,b(0.0f, 0.0f, 0.0f) 
      ,c(0.0f, 0.0f, 1.0f); 
D3DXMatrixLookAtLH(&matView, &a, &b, &c); 

pamiętać, że zignorował polecenie „bez dodatkowych linii kodu?” wymaganie, ponieważ jest to głupie wymaganie.

+5

Szczególnie, że można uniknąć tego problemu, po prostu usuwając nowe linie! – Joshua

+3

's/głupie wymaganie/żądanie, które jest mniej ważne niż wpisanie prawidłowego kodu/g' –

+3

Chciałbym móc dać +1 obu częściom tej odpowiedzi osobno. –

Powiązane problemy