Что означает сообщение об ошибке «Lvalue required»?Требуется lvalue
ответ
Именующего выражение является то, что может появиться на левую часть присваивания, другие слова, «то, что может быть назначен»
Итак, обратите внимание на уступки, где левая рука не «переуступка» Например, как-то просто, как это может вызвать такую ошибку
if (0 = foo)
{
}
Здесь вы получили попытку присвоить константу из-за случайное использование = вместо ==
Смотрите также
Это означает, что реализация ожидает объект, но вы только что прошли значение или функцию. Это происходит для присвоений, которые вы передали не-lvalue или для операций адреса, применяемых к не-функциям.
Lvalue означает «значение местоположения» и означает выражение, которое относится к объекту, объявленному как register
, или к ячейке памяти. Что-то вроде 42
- это значение, которое не соответствует ни критериям. Более формально существует три категории
- Lvalues: Обращайтесь к объектам. Сюда входят объявленные объекты const. Такими являются немодифицируемые значения l.
- Обозначения функций: относится к функциям.
printf
- это обозначение функции, но&printf
нет, а*&printf
- снова. - Другие: Иногда называются «rvalue» и стандартом, обозначенным как «значение выражения». Примерами являются
var + 0
(что дает значение, не связанное с объектами) или перечислитель перечисления.&printf
принадлежит к этой категории.
Ошибка возникает, если вы код somththing, как function(parameter) = value;
, потому что вы не можете назначить значение для чего-либо, что не является возможным контейнером для него.
Стандартные состояния C99 (6.3.2.1):
lvalue
является выражением с типом объекта или неполного типа, кроме пустоты; если lvalue
не определяет объект при его оценке, поведение не определено. Когда объект имеет определенный тип, тип определяется lvalue
, используемым для обозначения объекта. Модифицируемый lvalue
- это lvalue
, который не имеет типа массива, не имеет неполного типа, не имеет типа, соответствующего const, и если он является структурой или объединением, не имеет какого-либо члена (в том числе, рекурсивно, любого члена или элемент всех содержащихся агрегатов или объединений) с категориальным типом.
Название lvalue
приходит первоначально из выражения присваивания E1 = E2
, в которой левый операнд E1
требуется, чтобы быть (изменяемый) lvalue
. Это, пожалуй, лучше рассматривать как представление объекта «значение локатора». То, что иногда называют rvalue
, приведено в этом Международном стандарте, описываемом как «значение выражения».
Другими словами, lvalue
является то, что вы можете найти потенциально изменения. Модифицируемым lvalue
является то, что вы на самом деле разрешено изменить.
Например, C заявление:
x = 7;
справедливо, потому что x
является lvalue
. С другой стороны, утверждение:
14 = 7;
не действует, потому что 14
является не то, что вы можете найти для назначения.
Сниппет:
const int x = 7;
фактически создает lvalue
называется x
, даже если вы не допускается, чтобы изменить его (это не изменяемый `именующее).
nit picking, но технически это также может быть переменной, которая объявляется с помощью 'register', поэтому у нее может не быть адреса. –
«Если значение lvalue не назначает объект при его оценке, поведение не определено.» «За исключением случаев, когда поведение _not_ undefined:' & * (int *) 0; '(sic) – curiousguy
Скорее всего, это означает, что вы пытались присвоить значение чему-то, к которому нельзя назначить. Например, обе из следующих причин, вероятно, приведут к этой ошибке:
5 = 5; myObject-> myMethod() = 5;
Возможный дубликат ["l-value required" error] (http://stackoverflow.com/questions/1353384/l-value-required-error) –
@Paul это примерно C++. –