Somebody generalized the statement “Temporaries are rvalues“. I said “no” and gave him the following example
double k=3;
double& foo()
{
return k;
}
int main()
{
foo()=3; //foo() creates a temporary which is an lvalue
}
Is my interpretation correct?
Temporaries and rvalues are different (but related) concepts. Being temporary is a property of an object. Examples of objects that aren’t tempory are local objects, global objects and dynamically created objects.
Being an rvalue is a property of an expression. The opposite of rvalues are lvalues such as names or dereferenced pointers. The statement “Temporaries are rvalues” is meaningless. Here is the relationsip between rvalues and temporary objects:
Note that lvalues can also denote temporary objects!
Inside the function blah, the lvalue
sdenotes the temporary object created by evaluating the expressionstd::string("test").Your comment “references are lvalues” is also meaningless. A reference is not an expression and thus cannot be an lvalue. What you really mean is: