pass() reference argument and pass it to reference, however a rvalue argument actually called the reference(int&) instead of reference(int &&), here is my code snippet:
#include <iostream> #include <utility> void reference(int& v) { std::cout << "lvalue" << std::endl; } void reference(int&& v) { std::cout << "rvalue" << std::endl; } template <typename T> void pass(T&& v) { reference(v); } int main() { std::cout << "rvalue pass:"; pass(1); std::cout << "lvalue pass:"; int p = 1; pass(p); return 0; } the output is:
rvalue pass:lvalue lvalue pass:lvalue For p it is easy to understand according to reference collapsing rule, but why the template function pass v to reference() as lvalue?