Поделиться через


Значения Lvalue и Rvalue

Каждое выражение C++ является значением lvalue либо значением rvalue. Под значением lvalue понимается объект, существующий за пределами одного выражения. Значение lvalue можно представить как объект с именем. Все переменные, включая неизменяемые переменные (const), являются значениями lvalue. Rvalue — это временное значение, которое не сохраняется за пределами выражения, в котором оно используется. Чтобы лучше понять разницу между значениями lvalue и rvalue, рассмотрим следующий пример.

// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
   int x = 3 + 4;
   cout << x << endl;
}

В этом примере x — это значение lvalue, поскольку оно продолжает существовать за пределами выражения, в котором оно определено. Выражение 3 + 4 — это значение rvalue, поскольку оно возвращает временное значение, которое не сохраняется за пределами выражения, в котором оно определено.

В следующем примере показано несколько правильных и неправильных способов использования значений lvalue и rvalues.

// lvalues_and_rvalues2.cpp
int main()
{
   int i, j, *p;

   // Correct usage: the variable i is an lvalue.
   i = 7;

   // Incorrect usage: The left operand must be an lvalue (C2106).
   7 = i; // C2106
   j * 4 = 7; // C2106

   // Correct usage: the dereferenced pointer is an lvalue.
   *p = i; 

   const int ci = 7;
   // Incorrect usage: the variable is a non-modifiable lvalue (C3892).
   ci = 9; // C3892

   // Correct usage: the conditional operator returns an lvalue.
   ((i < 3) ? i : j) = 7;
}

Примечание

В примерах этого раздела показано правильное и неправильное использование при неперегруженных операторах.Перегрузив операторы, можно преобразовать выражение, такое как j * 4, в значение lvalue.

Термины lvalue и rvalue часто используются в связи с ссылками на объекты. Дополнительные сведения о ссылках см. в разделах Декларатор ссылки Lvalue: & и Декларатор ссылки Rvalue: &&.

См. также

Ссылки

Основные понятия

Декларатор ссылки Lvalue: &

Декларатор ссылки Rvalue: &&