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