#include <iostream>
#include <typeinfo>
struct X { };
template<typename T>
struct aux
{
void operator()(T&&) const { std::cout << 1 << std::endl; }
};
template<typename T>
struct aux<T&>
{
void operator()(T&) const { std::cout << 2 << std::endl; }
};
template<typename T> void g(T&& t)
{
aux<T>()(std::forward<T>(t));
}
int main()
{
X x;
g(x); // 2
g(X()); // 1
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CgpzdHJ1Y3QgWCB7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAKc3RydWN0IGF1eAp7CiAgdm9pZCBvcGVyYXRvcigpKFQmJikgY29uc3QgeyBzdGQ6OmNvdXQgPDwgMSA8PCBzdGQ6OmVuZGw7IH0gIAp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gCnN0cnVjdCBhdXg8VCY+CnsKICB2b2lkIG9wZXJhdG9yKCkoVCYpIGNvbnN0IHsgc3RkOjpjb3V0IDw8IDIgPDwgc3RkOjplbmRsOyB9ICAKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZyhUJiYgdCkKeyAKICAgIGF1eDxUPigpKHN0ZDo6Zm9yd2FyZDxUPih0KSk7IAp9CgppbnQgbWFpbigpCnsKICAgIFggeDsKICAgIGcoeCk7ICAgLy8gMgogICAgZyhYKCkpOyAvLyAxCn0=