// lvalues_and_rvalues2.cpp
int main()
{
int i, j, *p;
// Uso correcto: la variable i es un lvalue.
i = 7;
// Uso incorrecto: el operando a la izquierda debe ser un lvalue (C2106).
7 = i; // C2106
j * 4 = 7; // C2106
// Uso correcto: el puntero desreferenciado es un lvalue.
*p = i;
const int ci = 7;
// Uso incorrecto: la variable es un valor no modificable (C3892).
ci = 9; // C3892
// Uso correcto: el operador condicional devuelve un lvalue.
((i < 3) ? i : j) = 7;
}
这篇 MSDN 文章中有一个简短且相当清晰的解释。我翻译(强调我的):
所有 C++ 表达式都是左值或右值。左值是在表达式之外持续存在的对象。您可以将左值视为具有名称的对象。所有变量,包括硬编码(const)变量,都是左值。
右值是一个临时值,它不会在使用它的表达式之外持续存在。
为了更好地理解lvalue和rvalue之间的区别,请考虑以下示例:
这里
x
它是一个左值,因为它持续存在于定义它的表达式之外。表达式 3+4 是一个右值,因为它的计算结果是一个临时值,不会持续超出表达式。下面是一些不正确使用左值和右值的例子:
TL;DR(不是原始的一部分):您可以将值分配给左值(如果不是
const
)。不是rvalue,但您可以将其用作分配给lvalue的值。