为什么我会收到此错误消息?在我的旧编译器上它编译得很好,但在我的新编译器上它给了我一个错误:
错误:分配给强制转换是非法的,不支持左值强制转换
它指向的代码是这一行:
*((PWORD)pbyTmp)++ = (WORD)(((a_pw[0][i] * a_dX[0]) + (a_pw[1][i] * a_dX[1])) * a_dY[0] + 0.5);
您的“新编译器”是正确的。这不是有效的 C++。
强制转换(PWORD)
创建一个临时的并导致一个右值表达式,你不能分配任何东西;操作员++
分配一些东西。
在赋值的左侧放置一个漂亮、友好的左值表达式(即命名变量)。
问题不在于(句法)分配;它是后增量(当然在其语义中包括赋值)。
代码的预期效果可能是:
*((PWORD)(pbyTmp++)) = ...
也就是说,在强制转换表达式中移动后增量。
另一方面,您的旧编译器可能会丢弃后增量,从而导致:
*((PWORD)pbyTmp) = ...
要判断其中哪些是有意的和正确的,您必须充分理解代码的意图(这在您提供的片段中并不明显),或者检查旧编译器的汇编输出以了解如何它解释了代码。
问题是:
((PWORD)pbyTmp)++
你可能希望这个增量pbyTmp
指向下一个WORD
。相反,增量将应用于转换产生的临时对象,保持pbyTmp
不变。但是,为了防止此类错误引起的细微错误,该语言不允许在需要左值的地方使用临时变量,因此会出现错误。
据推测,您的旧编译器没有正确诊断错误,而是给出了某种未定义的行为。
您应该将转换后的指针放入正确类型的变量中:
PWORD * pword = reinterpret_cast<PWORD>(pbyTmp);
*pword++ = whatever;
pbyTmp = reinterpret_cast<WHATEVER_pbyTMP_IS>(pword);
或者,如果您真的讨厌必须维护您的代码的人,请转换为(左值)引用:
*((PWORD&)pbyTmp)++ = whatever;
或者,更好的是,将类型更改pbyTmp
为它所指向的正确类型。