【问题标题】:How to get around the warning "rvalue used as lvalue"?如何绕过警告“rvalue used as lvalue”?
【发布时间】:2012-01-06 19:06:24
【问题描述】:

我正在使用this tutorial,但是当我从中编译代码时:

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:使用了非标准扩展:类右值用作左值

在没有额外代码行的情况下正确(无警告)的方法是什么?

另外,我想知道那行代码有什么不好的地方?如果它工作得很好,为什么它甚至会发出警告?还是……?

【问题讨论】:

  • 事实是,不能取临时地址(右值)。 operator& 需要一个左值。警告正确地概述了这一点。但是,实际上,代码很好,因为临时对象将一直存在到完整表达式(函数调用)结束。
  • 它给出警告,因为代码不可移植。您的编译器具有允许它的非标准扩展;其他编译器可能会拒绝它。
  • 它的坏处是下次你会不小心把matView 也变成临时的。
  • 顺便说一句,这是一个完美的例子,说明了为什么你应该不完全相信你在互联网上找到的任意教程。 Stack Overflow 的答案是经过同行评审的,因此更值得信赖,而且答题者的声誉分数相当可靠地表明了答题者在很长一段时间内之前的同行评议成功。
  • @Xeo:当然不是所有的右值表达式都引用对象。 3 是一个对象吗? 3 没有存储空间。也许这只是一个警告(而不是错误)的原因是 this 案例中的右值表达式恰好引用了一个对象。

标签: c++ visual-c++ directx


【解决方案1】:

您正在使用临时地址。你不能那样做。事先声明你的向量:

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

请注意,我忽略了您的“没有额外的代码行?”要求,因为这是一个愚蠢的要求。

【讨论】:

  • 特别是因为您可以通过删除换行符来避免这个问题!
  • s/stupid requirement/request that's less important than writing correct code/g
  • 希望我可以分别 +1 这个答案的两个部分。
  • s/request that's less important than writing correct code/stupid requirement/g
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多