2010-10-09 2 views
9

Что означает сообщение об ошибке «Lvalue required»?Требуется lvalue

+0

Возможный дубликат ["l-value required" error] (http://stackoverflow.com/questions/1353384/l-value-required-error) –

+0

@Paul это примерно C++. –

ответ

7

Именующего выражение является то, что может появиться на левую часть присваивания, другие слова, «то, что может быть назначен»

Итак, обратите внимание на уступки, где левая рука не «переуступка» Например, как-то просто, как это может вызвать такую ​​ошибку

if (0 = foo) 
{ 

} 

Здесь вы получили попытку присвоить константу из-за случайное использование = вместо ==

Смотрите также

5

Это означает, что реализация ожидает объект, но вы только что прошли значение или функцию. Это происходит для присвоений, которые вы передали не-lvalue или для операций адреса, применяемых к не-функциям.

Lvalue означает «значение местоположения» и означает выражение, которое относится к объекту, объявленному как register, или к ячейке памяти. Что-то вроде 42 - это значение, которое не соответствует ни критериям. Более формально существует три категории

  • Lvalues: Обращайтесь к объектам. Сюда входят объявленные объекты const. Такими являются немодифицируемые значения l.
  • Обозначения функций: относится к функциям. printf - это обозначение функции, но &printf нет, а *&printf - снова.
  • Другие: Иногда называются «rvalue» и стандартом, обозначенным как «значение выражения». Примерами являются var + 0 (что дает значение, не связанное с объектами) или перечислитель перечисления. &printf принадлежит к этой категории.
0

Ошибка возникает, если вы код somththing, как function(parameter) = value;, потому что вы не можете назначить значение для чего-либо, что не является возможным контейнером для него.

2

Стандартные состояния 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, даже если вы не допускается, чтобы изменить его (это не изменяемый `именующее).

+1

nit picking, но технически это также может быть переменной, которая объявляется с помощью 'register', поэтому у нее может не быть адреса. –

+0

«Если значение lvalue не назначает объект при его оценке, поведение не определено.» «За исключением случаев, когда поведение _not_ undefined:' & * (int *) 0; '(sic) – curiousguy

0

Скорее всего, это означает, что вы пытались присвоить значение чему-то, к которому нельзя назначить. Например, обе из следующих причин, вероятно, приведут к этой ошибке:

5 = 5; myObject-> myMethod() = 5;