#include <iostream>
#include <type_traits>
#include <utility>
template<typename T>
struct f_caller
{
void operator () (T&& ) { std::cout << "T&&" << std::endl; }
void operator () (T const& ) { std::cout << "const T&" << std::endl; }
};
template <typename T>
void f(T&& t)
{
f_caller<typename std::decay<T>::type>()(std::forward<T>(t));
}
int main()
{
int i;
f(42);
f(i);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGZfY2FsbGVyCnsKICAgIHZvaWQgb3BlcmF0b3IgKCkgKFQmJiApIHsgc3RkOjpjb3V0IDw8ICJUJiYiIDw8IHN0ZDo6ZW5kbDsgfQogICAgdm9pZCBvcGVyYXRvciAoKSAoVCBjb25zdCYgKSB7IHN0ZDo6Y291dCA8PCAiY29uc3QgVCYiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGYoVCYmIHQpCnsKICAgIGZfY2FsbGVyPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGU+KCkoc3RkOjpmb3J3YXJkPFQ+KHQpKTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgaTsKICAgIGYoNDIpOwogICAgZihpKTsKfQo=