1

为什么我会收到此错误消息?在我的旧编译器上它编译得很好,但在我的新编译器上它给了我一个错误:

错误:分配给强制转换是非法的,不支持左值强制转换

它指向的代码是这一行:

*((PWORD)pbyTmp)++ = (WORD)(((a_pw[0][i] * a_dX[0]) + (a_pw[1][i] * a_dX[1])) * a_dY[0] + 0.5);
4

3 回答 3

1

您的“新编译器”是正确的。这不是有效的 C++。

强制转换(PWORD)创建一个临时的并导致一个右值表达式,你不能分配任何东西;操作员++分配一些东西。

在赋值的左侧放置一个漂亮、友好的左值表达式(即命名变量)。

于 2013-02-04T08:41:47.940 回答
1

问题不在于(句法)分配;它是后增量(当然在其语义中包括赋值)。

代码的预期效果可能是:

*((PWORD)(pbyTmp++)) = ...

也就是说,在强制转换表达式中移动后增量。

另一方面,您的旧编译器可能会丢弃后增量,从而导致:

*((PWORD)pbyTmp) = ...

要判断其中哪些是有意的和正确的,您必须充分理解代码的意图(这在您提供的片段中并不明显),或者检查旧编译器的汇编输出以了解如何它解释了代码。

于 2013-02-04T08:47:05.117 回答
0

问题是:

((PWORD)pbyTmp)++

你可能希望这个增量pbyTmp指向下一个WORD。相反,增量将应用于转换产生的临时对象,保持pbyTmp不变。但是,为了防止此类错误引起的细微错误,该语言不允许在需要左值的地方使用临时变量,因此会出现错误。

据推测,您的旧编译器没有正确诊断错误,而是给出了某种未定义的行为。

您应该将转换后的指针放入正确类型的变量中:

PWORD * pword = reinterpret_cast<PWORD>(pbyTmp);
*pword++ = whatever;
pbyTmp = reinterpret_cast<WHATEVER_pbyTMP_IS>(pword);

或者,如果您真的讨厌必须维护您的代码的人,请转换为(左值)引用:

*((PWORD&)pbyTmp)++ = whatever;

或者,更好的是,将类型更改pbyTmp为它所指向的正确类型。

于 2013-02-04T09:03:29.750 回答