2012-01-06 32 views
6

Tôi đang sử dụng this tutorial, nhưng khi tôi biên dịch mã từ nó:Làm thế nào để nhận được xung quanh cảnh báo "rvalue được sử dụng như 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 
); 

tôi nhận được:

C4238 cảnh báo: mở rộng không chuẩn được sử dụng: lớp rvalue sử dụng như giá trị trái

Cách thích hợp (không cảnh báo) khi thực hiện điều này mà không cần thêm dòng mã?

Ngoài ra, tôi tự hỏi điều gì quá tệ về dòng mã đó? Tại sao nó thậm chí còn đưa ra cảnh báo nếu nó hoạt động tốt? Hay là ...?

+1

Sự thật là bạn không thể lấy địa chỉ tạm thời (rvalue). 'toán tử &' * cần * một giá trị. Cảnh báo phác thảo chính xác điều đó. Tuy nhiên, thực tế nói, mã là tốt, kể từ khi thời gian sẽ sống cho đến khi kết thúc biểu thức đầy đủ (các cuộc gọi chức năng). – Xeo

+2

Nó đưa ra cảnh báo vì mã không di động. Trình biên dịch của bạn có phần mở rộng không chuẩn cho phép nó; các trình biên dịch khác có thể từ chối nó. –

+0

Điều xấu về nó là lần sau bạn sẽ vô tình làm cho 'matView' là tạm thời. – lapk

Trả lời

15

Bạn đang dùng địa chỉ tạm thời. Bạn không thể làm điều đó. Khai báo các vectơ của bạn trước:

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

Lưu ý rằng tôi đã bỏ qua "không có dòng mã bổ sung?" yêu cầu, bởi vì đó là một yêu cầu ngu ngốc.

+5

Đặc biệt là vì bạn có thể tránh được vấn đề đó đơn giản bằng cách xóa các dòng mới! – Joshua

+3

Yêu cầu/yêu cầu ngu ngốc/yêu cầu ít quan trọng hơn việc viết mã đúng/g' –

+3

Ước gì tôi có thể +1 cả hai phần của câu trả lời này một cách riêng biệt. –

Các vấn đề liên quan