Что такое rvalue и lvalue?

176
13 октября 2018, 19:50

На разных ресурсах нашел разные определения rvalue, lvalue. Как же правильно?

right value или read value?

left value или locator value?

Answer 1

Исходно речь шла про правую и левую части относительно оператора присваивания. Но правильного варианта такой простой расшифровки нет и быть не может. Термины так и останутся rvalue и lvalue. А вот какой в них вложен смысл чётко прописано в стандарте. Всё это образует категории выражений.

  • glvalue

    Выражение, чьё вычисление определяет сущность объекта, битового поля или функции.

  • prvalue

    Выражение, чьё вычисление инициализирует объект, битовое поле или вычисляет значение операнда оператора, с соответствии с контекстом использования.

  • xvalue

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

  • lvalue

    Это glvalue, которое не является xvalue.

  • rvalue

    Это prvalue или xvalue.

Таким образом любое выражение есть в первую очередь lvalue, xvalue или prvalue. rvalue - это уже обобщение.

Answer 2

Не знаю, что Вы имеете ввиду под вопросом "как правильно". rvalue и lvalue - это категории выражений. Вот что написано в стандарте:

— A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
— A prvalue is an expression > whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
— An xvalue is a glvalue that denotes an object or bit-field whose resources can be reused (usually because it is near the end of its lifetime).
— An lvalue is a glvalue that is not an xvalue.
— An rvalue is a prvalue or an xvalue.

//...
[Note: Historically, lvalues and rvalues were so-called because they could appear on the left- and right-hand side of an assignment (although this is no longer generally true); glvalues are “generalized” lvalues, prvalues are “pure” rvalues, and xvalues are “eXpiring” lvalues. Despite their names, these terms classify expressions, not values. — end note]

READ ALSO
Помогите мне с system();

Помогите мне с system();

В общем я делаю оболочку для одной программыДля запуска этой программы нужно в cmd отправить вот такой запрос: "C:\folder\executable

133
Как отсортировать вектор объектов C++

Как отсортировать вектор объектов C++

Есть класс Date (день, месяц, год) И есть вектор этих объектов Надо с помощью обычной сортировки sort() отсортировать по году и по названию месяца

128
Как собрать все objectName в ui_widgetname.h?

Как собрать все objectName в ui_widgetname.h?

Вопрос по Qt/ Создал много виджетов которые загружаются на одной главной формеМне нужно собрать все ключи чтобы менять объектам текст(лэйбл)

155
Указатели с C++ [дубликат]

Указатели с C++ [дубликат]

На данный вопрос уже ответили:

164