#include <utility>
#include <iostream>
#include <string>
template<typename T>
void printType(T&& t) {
std::cout << "T is " << (std::is_lvalue_reference<T>::value ? "lvalue" : "rvalue") << std::endl;
}
template<typename T>
void perfectForward(T&& t) {
std::cout << "Forwarding: ";
printType(std::forward<T>(t));
}
int main() {
int x = 10;
const int cx = 20;
std::cout << "Forwarding lvalue:" << std::endl;
perfectForward(x);
std::cout << "Forwarding const lvalue:" << std::endl;
perfectForward(cx);
std::cout << "Forwarding rvalue:" << std::endl;
perfectForward(5);
std::cout << "Forwarding string literal:" << std::endl;
perfectForward("hello");
return 0;
}