6 Basic concepts [basic]

6.10 Lvalues and rvalues [basic.lval]

Выражения классифицируются в соответствии с таксономией на рисунке [fig:categories].

categories expression expression expression glvalue glvalue glvalue expression->glvalue expression->glvalue rvalue rvalue rvalue expression->rvalue expression->rvalue lvalue lvalue lvalue glvalue->lvalue glvalue->lvalue xvalue xvalue xvalue glvalue->xvalue glvalue->xvalue rvalue->xvalue rvalue->xvalue prvalue prvalue prvalue rvalue->prvalue rvalue->prvalue
Рисунок 1 - Таксономия категории выражений
  • A glvalue - это выражение, оценка которого определяет идентичность объекта, битового поля или функции.

  • A prvalue - это выражение, оценка которого инициализирует объект или битовое поле или вычисляет значение операнда оператора в соответствии с контекстом, в котором он появляется.

  • An xvalue - это значение glvalue, которое обозначает объект или битовое поле, ресурсы которого можно использовать повторно (обычно потому, что срок его существования приближается к концу). [ Example: Определенные виды выражений, включающие rvalue references выходные значения x, такие как вызов функции, возвращаемый тип которой является ссылкой rvalue, или приведением к ссылочному типу rvalue. ] end example

  • An lvalue - это значение glvalue, которое не является значением x.

  • An rvalue - это prvalue или xvalue.

[ Note: Исторически lvalues ​​и rvalues ​​назывались так, потому что они могли появляться слева и справа от присваивания (хотя это больше не так); glvalues ​​- это «обобщенные» l-значения, prvalue - «чистые» r-значения, а xvalue - «eXpiring» l-значения. Несмотря на названия, эти термины классифицируют выражения, а не значения. ] Каждое выражение принадлежит ровно к одной из фундаментальных классификаций в этой таксономии: lvalue, xvalue или prvalue. Это свойство выражения называется его . [ Обсуждение каждого встроенного оператора в разделе указывает категорию значения, которое он дает, и категории значений операндов, которые он ожидает. Например, встроенные операторы присваивания ожидают, что левый операнд является lvalue, а правый операнд - prvalue, и в результате выдают lvalue. Определяемые пользователем операторы - это функции, а категории ожидаемых и получаемых ими значений определяются их параметрами и типами возвращаемых значений. ]end note value categoryNote: [expr] end note

result Из prvalue этого значения , которое экспрессирующих магазинов в его контекст. Иногда говорят, что prvalue, результатом которого является значение, V имеет значение или дает имя V. result object Из prvalue является объектом инициализируется prvalue; prvalue, которое используется для вычисления значения операнда оператора или которое имеет тип, cv void не имеет объекта результата. [ Note: За исключением случаев, когда prvalue является операндом a decltype-specifier, prvalue класса или типа массива всегда имеет объект результата. Для отброшенного значения prvalue материализуется временный объект; см. пункт [expr]. ] Значение glvalue - это сущность, обозначенная выражением.end note result

[ Note: Каждый раз, когда glvalue появляется в контексте, где ожидается prvalue, glvalue конвертируется в prvalue; см [conv.lval], [conv.array]и [conv.func]. Попытка привязать ссылку rvalue к lvalue не является таким контекстом; см [dcl.init.ref]. ] [ Нет битовых полей prvalue; если битовое поле есть , создается prvalue типа битового поля, которое затем может быть . ]end noteNote: converted to a prvalue promotedend note

[ Note: Каждый раз, когда prvalue появляется в контексте, где ожидается glvalue, prvalue преобразуется в xvalue; см [conv.rval]. ]end note

Обсуждение инициализации ссылок в [dcl.init.ref] и временных значений в [class.temporary] указывает на поведение lvalue и rvalues ​​в других значимых контекстах.

Если не указано иное ([expr.call]), prvalue всегда должен иметь полный тип или void тип. У glvalue не должно быть типа cv void. [ Note: Значение glvalue может иметь полный или неполныйvoid тип, отличный от типа. Класс и массив prvalue могут иметь типы с квалификацией cv; у других prvalues ​​всегда есть типы cv-unqualified. См. Пункт [expr]. ]end note

Значение lvalue имеет значение, modifiable если его тип не квалифицируется как const или не является типом функции. [ Note: Программа , которая пытается изменить объект с помощью выражения nonmodifiable именующего или через выражение RValue плохо сформированная ([expr.ass], [expr.post.incr], [expr.pre.incr]). ]end note

Если программа пытается получить доступ к сохраненному значению объекта с помощью glvalue, отличного от одного из следующих типов, поведение не определено:56

  • динамический тип объекта,

  • cv-квалифицированная версия динамического типа объекта,

  • тип similar к динамическому типу объекта,

  • тип, который является типом со знаком или без знака, соответствующим динамическому типу объекта,

  • тип, который является типом со знаком или без знака, соответствующим cv-квалифицированной версии динамического типа объекта,

  • тип агрегата или объединения, который включает в себя один из вышеупомянутых типов среди своих элементов или нестатических элементов данных (включая, рекурсивно, элемент или нестатический член данных субагрегата или содержащегося объединения),

  • тип, который является (возможно, cv-квалифицированным) типом базового класса динамического типа объекта,

  • a char, unsigned charили std​::​byte введите.

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