I am trying to understand how lvalues bind to rvalue references. Consider this code:
#include
template
void f(T&&
Since T
is a template argument, T&&
becomes a forwarding-reference. Due to reference collapsing rules, f(T& &&)
becomes f(T&)
for lvalues and f(T &&)
becomes f(T&&)
for rvalues.
0x499602D2 has already answered your question; nevertheless, the following changes to your code might give further insights.
I have added a static_assert
to f
to check the deduced type:
#include <type_traits>
template<typename T>
void f(T&& x) {
static_assert(std::is_same<T&&, int&>::value,"");
std::cout << x;
}
The assert does not fail, so the type of x
in f
is eventually int&
(in this particular example).
I have changed how g
is called in main
:
g(std::move(x));
Now the code compiles and the program works as expected and prints 44
.
Hope this helps a bit in understanding rvalue references.