4

鉴于此代码:

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

任何人都可以分解这些线吗?

一个演员然后一个增量?

有什么更简单的写法?

错误是什么意思?

4

6 回答 6

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++);
    }
}
于 2012-10-30T16:51:55.497 回答
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++;
    }
}
于 2012-10-30T16:55:37.530 回答
1

在这种情况下,显式类型转换的结果是右值- 根据 C++11 标准的 5.4.1。您不能将增量运算符应用于右值,它应该是左值。有关详细信息,请参阅C++ 值类别

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

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

while(sz8-- != 0)
{
    *(to_dbl++) = *(from_dbl++);
}
于 2012-10-30T16:57:33.197 回答
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++;
    }
}
于 2012-10-30T16:53:37.340 回答
0

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

于 2012-10-30T16:49:15.313 回答
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)++;
    }
}
于 2012-10-30T17:38:29.200 回答