требуется значение - PullRequest
       6

требуется значение

10 голосов
/ 09 октября 2010

что на самом деле означает сообщение об ошибке «Требуется Lvalue»

Ответы [ 5 ]

8 голосов
/ 09 октября 2010

lvalue - это то, что может появиться в левой части задания, другими словами, «то, что может быть назначено»

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

if (0 = foo)
{

}

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

Смотри также

6 голосов
/ 09 октября 2010

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

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

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

Стандарт C99 (6.3.2.1):


lvalue - это выражение с типом объекта или с неполным типом, отличным от void;если lvalue не обозначает объект при оценке, поведение не определено.Когда говорят, что объект имеет определенный тип, тип определяется lvalue, используемым для обозначения объекта.Модифицируемая lvalue - это lvalue, которая не имеет типа массива, не имеет неполного типа, не имеет типа с константой, и, если это структура или объединение, не имеет какого-либо члена (включаярекурсивно, любой член или элемент всех содержащихся агрегатов или объединений) с константным типом.

Имя lvalue происходит от выражения присваивания E1 = E2, в котором левый операнд E1 равендолжен быть (модифицируемым) lvalue.Возможно, это лучше рассматривать как представление объекта «значение локатора».То, что иногда называют rvalue, в этом международном стандарте описывается как «значение выражения».


Другими словами, lvalue - это то, что вы можете найти для возможного изменения.Модифицируемая lvalue - это та, которую вы на самом деле можете изменять .

Например, оператор C:

x = 7;

действителен, поскольку xэто lvalue.С другой стороны, утверждение:

14 = 7;

недопустимо, поскольку 14 является , а не чем-то, что можно найти для назначения.

Фрагмент:

const int x = 7;

фактически создает lvalue с именем x, даже если вам не разрешено его изменять (это не модифицируемое `lvalue).

0 голосов
/ 09 октября 2010

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

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

0 голосов
/ 09 октября 2010

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

...