鉴于此代码:
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
警告。
有人可以分解这些线吗?
施法然后增加?
什么是简单的写作方式?
错误是什么意思?
答案 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::copy
或memcpy
。
其他答案已经注意到您可以使用临时变量解决立即编译错误。
我不建议在任何情况下执行以下操作,但我相信您可以 通过转换为引用类型来实现此目的:
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)++;
}
}