#include <iostream>

template <typename T>
void func_impl(T&) {std::cout << "lvalue\n";}

template <typename T>
void func_impl(const T&) {std::cout << "const lvalue\n";}

template <typename T>
void func_impl(T&&) {std::cout << "rvalue\n";}

template <typename T>
void func_impl(const T&&) {std::cout << "const rvalue\n";}

template <typename T>
void func(T &&t)
{
	func_impl(std::forward<T>(t));
}

int main()
{
	int lvalue = 0;
	const int clvalue = 0;
	func(lvalue);
	func(clvalue);
	func(4);
}