解决C ++的赋值目标并不是真正的左值'错误

时间:2012-10-30 16:42:01

标签: c++ compiler-construction casting

鉴于此代码:

void FrMemCopy(void *to, const void *from, size_t sz)
{
    size_t sz8 = sz >> 3;
    size_t sz1 = sz - (sz8 << 3);

    while (sz8-- != 0) {
        *((double *)to)++ = *((double *)from)++;
    }

    while (sz1-- != 0) {
        *((char *)to)++ = *((char *)from)++;
    }
}

我在target of assignment not really an lvalue循环内的2行收到while警告。

有人可以分解这些线吗?

施法然后增加?

什么是简单的写作方式?

错误是什么意思?

6 个答案:

答案 0 :(得分:4)

它不喜欢*((char*)to)++声明。

试试这个:

void FrMemCopy(void *to, const void *from, size_t sz)
{
    size_t sz8 = sz >> 3;
    size_t sz1 = sz - (sz8 << 3);
    double * tod = (double *) to;
    double * fromd = (double *) from;
    while (sz8-- != 0) {
        *(tod++) = *(fromd++);
    }

    char * toc = (char *) tod;
    char * fromc = (char *) fromd;
    while (sz1-- != 0) {
        *(toc++) = *(fromc++);
    }
}

答案 1 :(得分:2)

您不能将++应用于演员表的结果,只能应用于左值(变量)。因此,您需要使用适当的增量类型创建新变量:

void FrMemCopy(void *to, const void *from, size_t sz)
{
    size_t sz8 = sz >> 3;
    size_t sz1 = sz - (sz8 << 3);

    double *to1 = (double *)to;
    double *from1 = (double *)from
    while (sz8-- != 0) {
        *to1++ = *from1++;
    }

    char *to2 = (char *)to1;
    char *from2 = (char *)from1;
    while (sz1-- != 0) {
        *to2++ = *from2++;
    }
}

答案 2 :(得分:1)

我试图以不会出现警告的方式重写它:

void FrMemCopy(void *to, const void *from, size_t sz)
{
    size_t sz8 = sz >> 3;
    size_t sz1 = sz - (sz8 << 3);

    double *xto = (double *)to;
    double *xfrom = (double *)from;
    while (sz8-- != 0) {
        *xto++ = *xfrom++;
    }

    char *cto = (char *)to;
    char *cfrom = (char *)from;
    while (sz1-- != 0) {
        *cto++ = *cfrom++;
    }
}

答案 3 :(得分:1)

在这种情况下,显式类型转换的结果是 rvalue - 根据C ++ 11 Standard的5.4.1。你不能将increment operator应用于右值,它应该是左值。有关详细信息,请参阅C++ value category

使用临时变量来获得所需的效果:

double* to_dbl = static_cast<double*>(to);
double* from_dbl = static_cast<double*>(from);

while(sz8-- != 0)
{
    *(to_dbl++) = *(from_dbl++);
}

答案 4 :(得分:0)

您正在对LValue执行递增操作(赋值运算符的左侧值)。逻辑上并且根据定义,LValue必须始终是变量。它不可能是一个常数。当您执行增量操作时,它会在左侧保留一个常量值,这会给您错误。

答案 5 :(得分:0)

在回答之前首先让我说:不要试图微观优化你的编译器/库。编译器编写者将从100次中获胜99次。根据您正在复制和需要的类型,使用std::copymemcpy

其他答案已经注意到您可以使用临时变量解决立即编译错误。

我不建议在任何情况下执行以下操作,但我相信您可以 通过转换为引用类型来实现此目的:

void FrMemCopy(void *to, const void *from, size_t sz)
{
    size_t sz8 = sz >> 3;
    size_t sz1 = sz - (sz8 << 3);

    while (sz8-- != 0) {
        *((double *&)to)++ = *((double *&)from)++;
    }

    while (sz1-- != 0) {
        *((char *&)to)++ = *((char *&)from)++;
    }
}