Lvalues e Rvalues
Cada expressão C++ é um l-value ou um r-value. Um l-value faz referência a um objeto que persiste após uma única expressão. Você pode pensar em um l-value como objeto que tem um nome. Todas as variáveis, incluindo as variáveis não modificáveis (const), são l-values. Um r-value é um valor temporário que não persiste além da expressão que o utiliza. Para entender melhor a diferença entre l-values e r-values, considere o exemplo a seguir:
// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int x = 3 + 4;
cout << x << endl;
}
Nesse exemplo, x é um l-value porque ele persiste além da expressão que o define. A expressão 3 + 4 é um r-value porque é avaliada como um valor temporário que não persiste além da expressão que o define.
O exemplo a seguir demonstra vários usos corretos e incorretos de l-values e r-values:
// 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;
}
Dica
Os exemplos neste tópico ilustram o uso correto e incorreto quando os operadores não são sobrecarregados.Ao sobrecarregar os operadores, é possível tornar uma expressão como j * 4 um l-value.
Os termos l-value e r-value geralmente são usados quando falamos de referências de objeto. Para obter mais informações sobre referências, consulte Declarador de referência Lvalue: & e Declarador de referência Rvalue: &&.