«lvalue требуется как левый операнд присваивания» в нечетном месте - C ++ - PullRequest
2 голосов
/ 07 января 2012

ПРИМЕЧАНИЕ. Это НЕ дубликат миллиарда и одного вопроса с этим именем в заголовке.Это связано с указателями и очень странными вещами, а не случайным = вместо ==.

У меня есть функция C ++, в которой у меня есть аргумент void* с именем out.У меня есть эта строка:

(char*)out=new char[*size];

Где size в uint32_t*.Компилятор жалуется:

fundemental_bin_types.h:55:32: error: lvalue required as left operand of assignment

Что не так?

Ответы [ 3 ]

7 голосов
/ 07 января 2012

(char*)out равно , а не lvalue (out само по себе может быть, но состав меняет вещи), приведение относится к другой стороне задания, и вы скорее приводите указатель на voidчем указатель на символ:

out = (void*) (new char[*size]);

В любом случае, void* неявно конвертируется из других указателей, так что вы можете обойтись просто:

out = new char[*size];
1 голос
/ 07 января 2012

C приведения указателя создают lvalue; Приведение указателя в C ++ не выполняется, если вы не приведете к ссылочному типу. Т.е. следующее должно компилироваться:

(char *&)out= new char[*size];
0 голосов
/ 07 января 2012

Удалите (char*), поскольку здесь это не имеет смысла. (Или это служит какой-то цели, которую вы не объяснили.)

Если у вас есть аргумент void *, вы не можете просто присвоить ему (чтобы этот указатель видел вызывающий объект), как вы могли бы аргумент void*&.

...