2017-09-08 5 views
0

J'essaye de faire une fonction qui prend un void*, copie de la mémoire, puis déplace le pointeur. Comme il est un pointeur vide, je pensais que je serais jeté à char* et propose que, comme suit:void * cast en char * pas lvalue?

PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size) 
{ 
    PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size); 
    ((char*)dest) += size; 
    return ret; 
} 

Cependant, VS se plaint de ((char*)dest) dire

expression

doit me une lvalue modifiable

que je pensais que c'était, depuis les travaux suivants:

PVOID SendAndMoveHead(PVOID dest, const Message& message, const size_t& size) 
{ 
    PVOID ret = CopyMemory(dest, (PVOID)message.msg.c_str(), size); 
    char* d = (char*)dest; 
    d += size; 
    return (PVOID)d; 
} 

Si quelqu'un pouvait faire la lumière sur pourquoi la première version ne devrait pas fonctionner, je l'apprécierais vraiment.

+0

Vous ne pouvez pas transformer l'opérande gauche de l'affectation. – metamorphling

+0

Copie possible de [Pourquoi une distribution lvalue fonctionne-t-elle?] (Https://stackoverflow.com/questions/15343276/why-does-an-lvalue-cast-work) –

+0

On peut dire que ceci devrait être étiqueté C, pas C++. – nwp

Répondre

2

((char*)dest) vous donne un nouveau char * temporaire. ((char*)dest) += size; changerait le temporaire et n'a aucun effet, ce qui provoque un échec de compilation.

Dans le deuxième exemple, d n'est pas temporaire et reste assez longtemps pour être renvoyé. Vous pouvez également écrire return (char*)dest + size;.