I see why you are confused. The thing to remember is that whenever you have a variable name, you have an l-value.
So when you say:
int i = 0; // lvalue (has a name i)
And also
int&& i = 0; // lvalue (has a name i)
So what is the difference?
The int&&
can only bind to an r-value so:
int n = 0;
int i = n; // legal
BUT
int n = 0;
int&& i = n; // BAD!! n is not an r-value
However
int&& i = 5; // GOOD!! 5 is an r-value
So when passing i
to f()
in this example you are passing an l-value, not an r-value:
void f(int &&);
int&& i = 5; // i is an l-value
f(i); // won't accept l-value
The situation is actually a little more complicated than I have presented here. If you are interested in a fuller explanation then this reference is quite thorough: http://en.cppreference.com/w/cpp/language/value_category
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…