This documentation is archived and is not being maintained.

L-Values and R-Values

Expressions in C++ can evaluate to l-values or r-values. L-values are expressions that evaluate to a type other than void and that designate a variable.

L-values appear on the left side of an assignment statement (hence the "l" in l-value). Variables that would normally be l-values can be made nonmodifiable by using the const keyword; these cannot appear on the left of an assignment statement. Reference types are always l-values.

The term r-value is sometimes used to describe the value of an expression and to distinguish it from an l-value. All l-values are r-values but not all r-values are l-values.

Some examples of correct and incorrect usages are:

// lValues_rValues.cpp
// C2106 expected
int main()
   int i, j, *p;
   i = 7;            // Correct. A variable name, i, is an l-value.
   7 = i;            // C2106. A constant, 7, is an r-value.
   j * 4 = 7;        // C2106. The expression j * 4 yields an r-value.
   *p = i;           // Correct. A dereferenced pointer is an l-value.
   const int ci = 7; // Declare a const variable.
   ci = 9;           // C2166 ci is a nonmodifiable l-value, so the
                     //  assignment causes an error message to
                     //  be generated.
    ((i < 3) ? i : j) = 7; // Correct. Conditional operator (? :) 
                          //  returns an l-value.
Note   The examples in this section illustrate correct and incorrect usage when operators are not overloaded. By overloading operators, you can make an expression such as j * 4 an l-value.

See Also

Basic Concepts