2009-08-30 6 views
1

Когда мы получим «л-значение требуется» ошибка ... во время компиляции программы на С ++ ??? (я использую VC++)«л-значение требуется» ошибка

+8

Пожалуйста, пост фрагмент кода. –

+3

Вы должны обязательно задать вопрос, по крайней мере, с сообщением об ошибке при вставке с копией, поскольку люди часто направляют их непосредственно в поисковую систему. – sharkin

ответ

11

«именующий» является значением, которое может быть объектом уступки. «L» означает «левый», как в левой части знака равенства. Значение r - значение правой руки и выдает значение и не может быть назначено напрямую. Если вы получаете «lvalue required», у вас есть выражение, которое генерирует rvalue, когда требуется lvalue.

Например, константа является значением rvalue, но не значением lvalue. Итак:

1 = 2; // Not well formed, assigning to an rvalue 
int i; (i + 1) = 2; // Not well formed, assigning to an rvalue. 

не работает, но:

int i; 
i = 2; 

делает. Обратите внимание, что вы можете вернуть lvalue из функции; например, вы можете вернуть ссылку на объект, который предоставляет оператор =().

Как отметил Павел Минаев в комментариях, это не формальное определение lvalues ​​и rvalues ​​в языке, а попытки дать описание кому-то, запутанному в ошибке об использовании rvalue, где требуется lvalue. C++ - это язык со многими подробностями; если вы хотите получить официальное оформление, обратитесь к официальной ссылке.

+1

«l» также означает «локатор», поскольку значение l определяет значение локатора местоположения хранилища. – sharkin

+0

Еще хуже: '= 10;' –

+3

Это определение не совсем корректно. Например, функция, возвращающая экземпляр 'std :: string', вернет временное значение rvalue; однако, что rvalue имеет 'operator =' и, следовательно, может появиться в левой части '=' - но, как rvalue, он не будет связываться с неконстантной ссылкой. С другой стороны, переменная 'const std :: string' является значением lvalue, даже если вы не можете назначить ему (потому что это const). –

2

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

1

Вы пытаетесь использовать недопустимое значение для l-значения где-то в вашем коде. Значение l является выражением, которому можно присвоить значение.

Например, вы могли бы иметь такое заявление следующее:

10 = x; 

, где вместо него вы должны иметь:

x = 10; 

Хотя это, вероятно, это не очевидно, в вашем случае.

+0

Не обязательно «место памяти», на самом деле. – strager

+0

@strager: lvalue относится к объекту. Объект - это область хранения. – sellibitze

0

Попробуйте скомпилировать:

5 = 3; 

и вы получите error: lvalue required as left operand of assignment

2

Обычно одна привыкшие к C++ может кодировать

if ((x+1)=72) ... 

вместо

if ((x+1)==72) ... 

первое средство назначить 72 до х + 1 (ясно недействительным), в отличие от проверки на равенство между 72 и (x + 1)

0

R Значение - это выражение, которое всегда отображается с правой стороны оператора присваивания Например:

int a = 5;//here 5 is Rvalue

L Значение - это выражение, которое может быть либо с левой, либо с правой стороны от назначения. Когда оно находится слева, оно относится к месту, которое может удерживать значение.

Here a in expression a = 5 is L Value

и при появлении на правой стороне значения считывается из значения L. Поскольку величина R, которая не имеет возможности найти любую память, которую он не может занимать какую-либо ценность, как Lvalue так

5 = 6 or 5 = a

будет ошибка компиляции.

0

Мы присваиваем значение переменной. Если мы попытаемся сделать обратную вещь, тогда появятся ошибки L-значения.

int x,y,z; 
x=1; 
y=2; 
z=x+y; //Correct 
x+y=z; //L-value required 
0

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

именующее ошибка:

if (n = 100) { code } // this is incorrect and comes back with the lvalue error 

исправить:

if (n == 100) { code } // this resolved my issue 
Смежные вопросы