Lvalues i Rvalues
Każde wyrażenie języka C++ jest l-wartością lub r-wartością.L-wartość odnosi się do obiektu, który wykracza poza pojedyncze wyrażenie.L-wartość można traktować jako obiekt, który ma nazwę.Wszystkie zmienne, łącznie z niemodyfikowalnymi zmiennymi (const), są l-wartościami.R-wartość jest tymczasową wartością, która nie wykracza poza wyrażenie, które go używa.Aby lepiej zrozumieć różnicę między l-wartościami i r-wartościami, warto rozważyć następujący przykład:
// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int x = 3 + 4;
cout << x << endl;
}
W tym przykładzie, x jest l-wartością, ponieważ utrzymuje się poza wyrażeniem, które ją definiuje.Wyrażenie 3 + 4 jest r-wartością, ponieważ szacuje do tymczasowej wartości, która nie utrzymuje się poza wyrażeniem, które ją definiuje.
W poniższym przykładzie zademonstrowano kilka poprawnych i niepoprawnych zastosowań l-wartości i r-wartości:
// 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;
}
[!UWAGA]
Przykłady w tym temacie ilustrują poprawny i niepoprawny sposób użycia, gdy operatory nie są przeciążone.Przeciążając operatory, można sprawić, że wyrażenie takie jak j * 4 będzie l-wartością.
Terminy l-wartość i r-wartość są często używane przy odnoszeniu się do odwołań do obiektu.Aby uzyskać więcej informacji dotyczących odwołań, zobacz Deklarator odwołania do wartości L: & i Deklarator odwołania do wartości R: &&.