void* приведено к char* не lvalue?

Я пытаюсь создать функцию, которая принимает void*, копирует в нее часть памяти, а затем перемещает указатель. Поскольку это пустой указатель, я подумал, что приведу его к char* и переместлю его вот так:

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;
}

Однако VS жалуется на то, что ((char*)dest) говорит

выражение должно иметь модифицируемое lvalue

что я и думал, так как следующие работы:

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;
}

Если бы кто-то мог пролить свет на то, почему первая версия не должна работать, я бы очень признателен.


person Elias Finoli    schedule 08.09.2017    source источник
comment
Вы не можете привести левый операнд присваивания.   -  person metamorphling    schedule 08.09.2017
comment
Возможный дубликат Почему работает приведение lvalue?   -  person Adrian Shum    schedule 08.09.2017
comment
Возможно, это должно быть помечено C, а не C++.   -  person nwp    schedule 08.09.2017
comment
@nwp - const Message& и message.msg.c_str() не оставляют места для споров.   -  person StoryTeller - Unslander Monica    schedule 08.09.2017


Ответы (1)


((char*)dest) дает вам новый временный char *. ((char*)dest) += size; изменит временное значение и не окажет никакого влияния, что приведет к сбою компиляции.

Во втором примере d не является временным и живет достаточно долго, чтобы его вернули.

В качестве альтернативы вы можете написать return (char*)dest + size;.

person nwp    schedule 08.09.2017