2012-01-06 3 views
6

Я использую this tutorial, но когда я скомпилировать код из него:Как обойти предупреждение «rvalue используется как 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 
); 

я получаю:

предупреждение C4238: нестандартное расширение используется: класс RValue, используемый в качестве Lvalue

Каков правильный (безответный) способ сделать это без дополнительных строк кода?

Кроме того, мне интересно, что так плохо в этой строке кода? Почему он даже дает предупреждение, если он работает нормально? Или это ...?

+1

Факт в том, что вы не можете принять адрес временного (rvalue). 'operator &' * * нуждается в lvalue. Предупреждение правильно описывает это. Однако, практически говоря, код в порядке, так как временные записи будут жить до конца полного выражения (вызов функции). – Xeo

+2

Он дает предупреждение, потому что код не переносится. У вашего компилятора есть нестандартное расширение, которое позволяет это; другие компиляторы могут его отклонить. –

+0

Плохая вещь в том, что в следующий раз вы случайно сделаете «matView» также временным. – lapk

ответ

15

Вы берете адрес временного. Вы не можете этого сделать. Заполните ваши векторы заранее:

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

Обратите внимание, что я проигнорировал ваш «без дополнительных строк кода»? потому что это глупое требование.

+5

Тем более, что вы можете избежать этой проблемы, просто удалив новые строки! – Joshua

+3

's/глупое требование/запрос, что менее важно, чем писать правильный код/​​g' –

+3

Жаль, что я мог бы +1 обе части этого ответа отдельно. –