что означает сообщение об ошибке "Lvalue required"?
Требуется значение lvalue
Ответ 1
lvalue - это то, что может появиться в левой части задания, другими словами "что-то, что может быть назначено"
Итак, найдите назначение, где левая сторона не является "назначаемой", например, что-то простое, поскольку это может вызвать такую ошибку.
if (0 = foo)
{
}
Здесь у вас есть попытка назначить константу из-за случайного использования =, а не ==
См. также
Ответ 2
Это означает, что реализация ожидает объект, но вы просто передали значение или функцию. Это происходит для присвоений, которые вы передали не-lvalue или для операций адреса, применяемых к не-функциям.
Lvalue означает "значение местоположения" и означает выражение, которое ссылается на объект, объявленный как register
, или на ячейку памяти. Что-то вроде 42
- это значение, которое не соответствует ни критериям. Более формально существует три категории
- Lvalues: обращение к объектам. Сюда входят объявленные объекты const. Такими являются немодифицируемые значения l.
- Обозначения функций: обращение к функциям.
printf
- это обозначение функции, но&printf
нет, а*&printf
снова. - Другие: иногда называются "rvalue" и стандартом, описанным как "значение выражения". Примерами являются
var + 0
(дающие значение, не связанное с объектами) или перечислитель перечисления.&printf
принадлежит к этой категории.
Ответ 3
Стандартные состояния C99 (6.3.2.1):
An lvalue
- выражение с типом объекта или неполным типом, отличным от void; если lvalue
не назначает объект при его оценке, поведение undefined. Когда объект имеет определенный тип, тип определяется 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
, даже если вам не разрешено его изменять (это не изменяемое значение l).
Ответ 4
ошибка возникает, если вы код somththing как function(parameter) = value;
, потому что вы не можете назначить значение для чего-либо, что для него не является возможным контейнером.
Ответ 5
Скорее всего, это означает, что вы пытались присвоить значение тому, что не может быть назначено. Например, обе из следующих причин могут вызвать эту ошибку:
5 = 5; myObject- > myMethod() = 5;