2012-01-06 14 views
6

Sto utilizzando this tutorial, ma quando compilo il codice da esso:Come aggirare l'avviso "rvalore usato come 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 
); 

ottengo:

C4238 di avviso: estensione non standard utilizzata: classe rvalue utilizzato come lvalue

Qual è il modo corretto (senza avvisi) per farlo senza righe di codice aggiuntive?

Inoltre, mi chiedo cosa c'è di male in quella riga di codice? Perché dà anche un avvertimento se funziona bene? O lo fa ...?

+1

Il fatto è che non puoi prendere l'indirizzo di un temporaneo (valore). 'operator &' * ha bisogno di * un lvalue. L'avvertimento sottolinea correttamente questo. Comunque, in pratica, il codice va bene, poiché i temporari vivranno fino alla fine dell'espressione completa (la chiamata di funzione). – Xeo

+2

Fornisce l'avviso perché il codice non è portatile. Il tuo compilatore ha un'estensione non standard che lo consente; altri compilatori potrebbero rifiutarlo. –

+0

La cosa brutta a questo proposito è che la prossima volta farai in modo che anche matView sia temporaneo. – lapk

risposta

15

Stai prendendo l'indirizzo di un temporaneo. Non puoi farlo. Dichiara in anticipo i tuoi vettori:

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); 

Nota che ho ignorato il tuo "senza righe di codice aggiuntive?" requisito, perché quello è un requisito stupido.

+5

Soprattutto perché puoi evitare quel problema semplicemente rimuovendo le newline! – Joshua

+3

's/requisito stupido/richiesta meno importante della scrittura del codice corretto/g' –

+3

Vorrei poter fare +1 su entrambe le parti di questa risposta separatamente. –

Problemi correlati