Voilà qui clarifie bien les choses.
La conversion de rvalue en lvalue est assez tordue :
"This doesn't mean that lvalues can't be produced from rvalues by more explicit means. For example, the unary '' (dereference) operator takes an rvalue argument but produces an lvalue as a result. Consider this valid code:
p = &arr[0];
int arr[] = {1, 2};
int
(p + 1) = 10; // OK: p + 1 is an rvalue, but (p + 1) is an lvalue
Conversely, the unary address-of operator '&' takes an lvalue argument and produces an rvalue:
"
int var = 10;
int bad_addr = &(var + 1); // ERROR: lvalue required as unary '&' operand
int addr = &var; // OK: var is an lvalue
&var = 40; // ERROR: lvalue required as left operand
// of assignment