За последние несколько дней некоторые из наших читателей сообщили всем, что они столкнулись с ошибкой в 1 ценнике.
Одобрено: Fortect
Эта ошибка возникает, когда мы всегда помещаем одно и то же слева от оператора = вместе с переменными справа. Таким образом, им нужен arr в качестве адреса, а сторона остановки считается постоянной, поэтому ошибка, скорее всего, появится как требуемое значение L.
ArchnzacОн стал использоваться как глобальная переменная и указывает на настоящую полезную ошибку, которая произошла во время соединения с функцией. Вы можете найти различные коды ошибок внутри
“lvalue” часто является целью назначения. «L» означает «заброшенный», так как левая сторона представляет собой символ. Rvalue является правильным значением руки и генерирует значение, которое не может и не может быть присвоено в частности. Если вы получили «lvalue required», у этих людей есть выражение, которое возвращает rvalue до того, как lvalue требуется.
Для модели человека константа – это r-значение, но на самом деле l-значение. Итак:
конкретное = 2; // Не очень хорошо обучен, присвоение rvalueint i; (i + 1) равно 2; // Неправильно сформировано, rvalue получает большое значение.
int i;я = 2;
Сделай это. Отметьте, кому вы можете вернуть lvalue из одной конкретной функции; Например, вы можете получить ссылку и объект, использующий наездник = ().
Как Павел Минаев часто указывал в комментариях, это не обычное определение lvalues и rvalues на соответствующем языке, а скорее попытка сообщить кому-то, кто представляет ошибку в использовании rvalues. и где очень lvalue считается необходимым критерием. C ++ – это язык из-за множества деталей; Если вы хотите приехать официально, вам действительно стоит обратиться к авторизованному представителю.
Термины lvalue и rvalue не обязательно часто встречаются при разработке на C / C ++, но когда вы это делаете, их значение не сразу становится очевидным. Чаще всего эти термины включаются в сообщения об ошибках и предупреждения компилятора. Пример компиляции, если вы следуете с gcc :
Верно, этот код по своей сути привлекателен и не то, что вы бы написали, но когда в сообщении об ошибке lvalue упоминается, это новый термин, который часто встречается в руководствах по C / C ++. Другой пример – компиляция этого пароля с помощью g ++ :
Здесь, несомненно, ошибка снова связана с загадочным значением rvalue. Итак, что означает lvalue rvalue в C и C ++? Это то, что я хочу исследовать в этой статье.
Одобрено: Fortect
Fortect — самый популярный и эффективный в мире инструмент для ремонта ПК. Миллионы людей доверяют ему обеспечение быстрой, бесперебойной и безошибочной работы своих систем. Благодаря простому пользовательскому интерфейсу и мощному механизму сканирования Fortect быстро находит и устраняет широкий спектр проблем Windows — от нестабильности системы и проблем с безопасностью до проблем с управлением памятью и производительностью.
а>
int foo () return 2;int main () foo () равно 2; Возвращает 0;
test.c: в" основном "аспекте:test.c: 8: 5: ошибка lvalue: требуется как обычный операнд присваивания
Что это за тип определения значения L?
Фактически значение s является одним из следующих: назначение переменных любого типа; Нижний индекс ([]) обозначает, что не соответствует определенному широкому диапазону. Унарное косвенное выражение (*), которое не может ссылаться, если вы хотите использовать массив. Выражение L-значения в круглых скобках.
testcpp.cpp: в функции int & foo ():testcpp.cpp: 5:12: Ошибка: неправильная инициализация непостоянной ссылкиМетод, связанный с 'int &' записи 'int'
Практическое определение
В этом разделе намеренно упрощено объяснение значений lvalues и rvalues. Остальная часть статьи объяснит здесь.
Это наглядный пример ошибки lvalue?
Ошибки Lvalue возникают, поскольку вы новое значение lvalue не является переменной, которая может содержать значение. LValue – сильная константа (или) не переменная. Это одноразовые буквенно-цифровые символы. (5, a, 6.9, $ и т. Д.) Пример: вместо a = 5; в программе сверху, если бы это могло быть 5, равно a; это будет ошибка LValue. LValue определенно является постоянной величиной.
lvalue (значение локатора) представляет в настоящее время объект, в котором факт занимает впечатляющее место (то есть память генерирует адрес).
rvalue определяется пропуском, говоря, что каждое отдельное выражение является либо lvalue, либо определенным rvalue. Таким образом, большое rvalue, далеко от стандарта lvalue, описанного выше, – это термин, который не означает, что объект занимает новое хорошо идентифицируемое место, которое несет память.
Простые примеры
Приведенные выше термины могут показаться необъяснимыми, поэтому чрезвычайно важно правильно выделить несколько простых примеров.
Предположим, у нас есть воспринимаемая и присвоенная целочисленная переменная:
Присваивание ожидает прекрасного lvalue в качестве отброшенного операнда, а var , скорее всего, будет lvalue, поскольку это несравнимый элемент. Следующие элементы недействительны для вашей текущей страницы:
Ни целочисленное продолжение 4 , ни выражение var + 1 не являются lvalue (что делает людей rvalues). Это не lvalue, потому что почти все ответы являются временными выражениями без точного хорошо известного местоположения (т.е. они, возможно, недавно находились во временном регистре для наиболее важного атрибута вычисления). смысла нет – назначать некуда.
Таким образом, смысл сообщения об ошибке в фактическом первом фрагменте кода должен быть понятен. foo tax возвращает временное значение, которое было очень хорошим rvalue. Попытка присвоить ситуацию является эффективной ошибкой, если это так, foo () подразумевает 2; компилятор жалуется, что эксперты утверждают, что он ожидал увидеть lvalue, содержащее оператор присваивания слеваa.
Значение 1 отправляет конкретное выражение объекту, который существует после того, как имейте это в виду. Значение r – это важная временная ценность, которая не сохраняется вне оператора, который его использует.
Однако не все сопоставления результатов вызова универсальной функции являются недопустимыми. Для демонстрации, ссылки на C ++ делают это возможным:
Здесь foo получает ссылку, которая является ценным значением I, для которого она может быть запрошена. Фактически, способность C ++ допускать l значений из функций важна для использования других перегруженных операторов. Типичный пример – переполнение оператора ловушки [] в словах, которые реализуют какой-то вид доступа к поиску. заболевание, передающееся половым путем :: map выполняет следующие действия:
Назначение mymap [10] будет продолжать работать, потому что его неконстантная перегрузка std :: road map :: operator [] возвращает карту, относящуюся к назначенный.
4 подразумевает var; // ЧУВСТВО ВИНЫ!(var + 1) = 4; // ЧУВСТВО ВИНЫ!
int globalvar = 20;int & foo () Платите за глобальную переменную;int необходимо () foo () равно 10; король 0;
lvalue Указывает левую запись. В частности, левая сторона гарантирует оператор присваивания. rvalue означает истинное лучшее значение страницы. В частности, это действительно плохая оценка или фраза от вызывающего продавца.
std :: mapmymap;mymap [10] соответствует 5.6;
Редактируемые значения I.
Первоначально, после того, как для It c были установлены lvalue, это буквально могло означать «подходящие значения для застрявшей стороны присваивания». Однако позже, когда ISO C содержал ключевое слово const , это конкретное определение пришлось уточнить. Ведь:
Итак, внесите дополнительные пояснения в качестве способа добавления. Не все lvalue могут остаться затронутыми. Эти распознавания можно изменить. Формально стандартные результаты C99 являются изменяемыми значениями, например:
<цитата>текущее lvalue не обязательно имеет тип массива, не использует превосходный неполный тип, не имеет последнего лучшего константного типа и, если это структура или объединение, n ‘не имеет определенного члена (включая , рекурсивно, каждый элемент или часть всех содержащихся агрегатов или объединений) с определенной квалифицированной константой.
const int означает 10; // 'a' - это значение 1а равно и 10; // но не может быть назначен!
Преобразование между значениями L и R
Как правило, конструкции вербального языка выбора, которые работают с объектами, предполагают, что в качестве аргументов требуются его значения. Например, конкретный оператор двоичного сложения '+' принимает два существующих rvalue в качестве аргументов и возвращает одно rvalue:
Как мы видели ранее, a с b – это два L-значения. Следовательно, в третьей строке они неявно преобразуют все значение l в значение r. Все lvalue, которые, в свою очередь, не являются массивами, функциями или неполными типами, но могут быть преобразованы в rvalue.
И наоборот? Можно ли изменить rvalues на lvalues? Конечно, нет! Это, вероятно, нарушило бы дикую природу хорошего lvalue, как это определено [1].
Это не означает, что lvalue нельзя пытаться явно сгенерировать из rvalue. Например, любой другой унарный оператор '*' (разыменование) принимает приличный новый аргумент rvalue, но по существу дает мощный результат lvalue. Взгляните на этот действительный префикс:
Повысьте производительность вашего компьютера с помощью этой простой загрузки. г.