As far as I'm aware C++ standard does't distinguish between rvalue references and forwarding references.
I'd like to know the reason behind that.
If I want to write a template function that only accepts lvalue expressions I do the following:
template<typename T>
void func(T& param);
But if I want to write a template function that only accepts rvalue expressions:
template<typename T>
void func(T&& param);
it turns out that this function also accepts lvalue expressions.
So the question is: what is the logic behind this language design?