对强制转换的Xcode赋值是非法的,不支持左值转换?

时间:2013-02-04 08:35:56

标签: c++ xcode

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

  

错误:转换为非法,不支持左值转换

它指向的代码就是这一行:

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

3 个答案:

答案 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的类型更改为指向的正确类型。