Lvalues and rvalues
const
object
is an lvalue that cannot be modified. The term modifiable lvalue is
used to emphasize that the lvalue allows the designated object to
be changed as well as examined. The following object types are lvalues,
but not modifiable lvalues: - An array type
- An incomplete type
- A
const
-qualified type - A structure or union type with one of its members qualified as
a
const
type
The term rvalue refers to a data value that is stored at some address in memory. An rvalue is an expression that cannot have a value assigned to it. Both a literal constant and a variable can serve as an rvalue. When an lvalue appears in a context that requires an rvalue, the lvalue is implicitly converted to an rvalue. The reverse, however, is not true: an rvalue cannot be converted to an lvalue. Rvalues always have complete types or the void type.
C defines a function designator as an expression that has function type. A function designator is distinct from an object type or an lvalue. It can be the name of a function or the result of dereferencing a function pointer. The C language also differentiates between its treatment of a function pointer and an object pointer.
On the other hand, in C++, a function call that returns a reference is an lvalue. Otherwise, a function call is an rvalue expression. In C++, every expression produces an lvalue, an rvalue, or no value.
Operator | Requirement |
---|---|
& (unary) | Operand must be an lvalue. |
++ -- | Operand must be an lvalue. This applies to both prefix and postfix forms. |
= += -= *= %= <<= >>= &= ^= |= | Left operand must be an lvalue. |
For example, all assignment operators evaluate their right operand and assign that value to their left operand. The left operand must be a modifiable lvalue or a reference to a modifiable object.
&
) requires an lvalue
as an operand while the increment (++
) and the decrement
(--
) operators require a modifiable lvalue as an
operand. The following example shows expressions and their corresponding
lvalues.
Expression | Lvalue |
---|---|
x = 42 |
x |
*ptr = newvalue |
*ptr |
a++ |
a |
int& f() |
The function call to f() |