Xvalue
An rvalue reference that is to expire.
(Prvalue)
rvalue
non-xvalue
expression
that appears only on the right side of an assignment expression.
Rvalues include both xvalues and prvalues.
Lvalues and xvalues can be referred as glvalues.
(prvalue)
rvalues can be cv-qualified,
but non-class
(prvalue)
rvalues cannot be cv-qualified.
and xvalues
can be of incomplete types,
but
(prvalue)
rvalues must be of complete
types or void types.
or xvalue
is an expression
that refers to such an object. An lvalue does not necessarily permit
modification of the object it designates. For example, a 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. Lvalues of the following
object types are not modifiable lvalues:
except where a suitable assignment operator exists
.
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.
A function call that returns an lvalue reference is an lvalue. Expressions can produce
an lvalue,
an xvalue
, a
(prvalue)
rvalue, or no value. 
built-in
operators require lvalues
for some of their operands. The following table
lists these operators and additional constraints on their usage. | Operator | Requirement |
|---|---|
| & (unary) | Operand must be an lvalue. |
| ++ -- | Operand must be a modifiable lvalue. This applies to both prefix and postfix forms. |
| = += -= *= %= <<= >>= &= ‸= |= | Left operand must be a modifiable 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.
| Expression | Lvalue |
|---|---|
| x = 42 | x |
| *ptr = newvalue | *ptr |
| a++ | a |
int& f() |
The function call to f() |

int a;
int&& b= static_cast<int&&>(a);
struct str{
int c;
};
int&& f(){
int&& var =1;
return var;
}
str&& g();
int&& rc = g().c;
In this example, The initializer for rvalue reference b is
an xvalue because it is a result of a cast to an rvalue reference.
A call to the function f() produces an xvalue because
the return type of this function is of the int&& type.
The initializer for rvalue reference rc is an xvalue
because it is an expression that accesses a nonstatic non-reference
data member c through an xvalue expression. 

When
compiled with the GNU C language extensions enabled, compound expressions,
conditional expressions, and casts are allowed as lvalues, if their
operands are lvalues. The use of this language
extension is deprecated for C++ code.
(x + 1, y) *= 42;
x + 1, (y *=42);
&(x + 1, y);
x + 1, &y;
A conditional expression can be a
valid lvalue if its type is not void and both of its branches for
true and false are valid lvalues. Casts are valid lvalues if the operand
is an lvalue. The primary restriction is that you cannot take the
address of an lvalue cast. 
