What is exactly happening here? Why is this an error?
void f(int &&);
int && i = 5;
f(i);
Isn\'t it a bit counterintuitiv
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