#include <iostream>
#include <functional>
void fun1(int& val) { std::cout<< "lvalue" << std::endl;}
void fun1(int&& val) { std::cout<< "rvalue" << std::endl;}
void fun2(int&& val) { fun1(val);}
template<typename T>
void fun3(T& val) { std::cout<< "lvalue" << std::endl;}
template<typename T>
void fun3(T&& val) { std::cout<< "rvalue" << std::endl;}
template<typename T>
void fun4(T&& val) {
fun3(std::forward<T>(val));
}
int main() {
int v = 10;
fun2(std::move(v));
fun1(std::move(v));
int&& v1 = 10;
fun1(v1);
fun2(10);
std::cout << "------------" << std::endl;
fun4(v);
fun4(10);
return 0;
}