2012-01-06 16 views
6

estoy usando this tutorial, pero cuando compilo el código de él:¿Cómo evitar la advertencia "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 
); 

me sale:

C4238 advertencia: la extensión no estándar utilizado: rvalue clase utilizada como valor-

¿Cuál es la forma correcta (sin advertencias) de hacer esto sin líneas adicionales de código?

Además, me pregunto qué tiene de malo esa línea de código. ¿Por qué incluso da una advertencia si funciona bien? O lo hace ...?

+1

El hecho es que no puede tomar la dirección de un temporal (rvalue). 'operator &' * needs * an lvalue. La advertencia describe correctamente eso. Sin embargo, prácticamente hablando, el código está bien, ya que los temporales vivirán hasta el final de la expresión completa (la llamada a la función). – Xeo

+2

Da la advertencia porque el código no es portátil. Su compilador tiene una extensión no estándar que lo permite; otros compiladores pueden rechazarlo. –

+0

Lo malo de esto es que la próxima vez, accidentalmente, harás de 'matView' un temporal también. – lapk

Respuesta

15

Usted está tomando la dirección de un temporal. No puedes hacer eso. Declarar sus vectores de antemano:

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

Tenga en cuenta que no hice caso de su "sin líneas adicionales de código?" requisito, porque ese es un requisito estúpido.

+5

¡Especialmente porque puede evitar ese problema simplemente eliminando las nuevas líneas! – Joshua

+3

's/requisito/solicitud estúpido que es menos importante que escribir el código correcto/g' –

+3

Desearía poder +1 ambas partes de esta respuesta por separado. –

Cuestiones relacionadas