#include <iostream>
using namespace std;
#define FWD(v) \
std::forward< \
typename std::remove_const<\
typename std::remove_reference<\
decltype(v)>::type>::type>(v)
void foo(int& a) { cout << "ref" << endl; }
void foo(const int& a) { cout << "cref" << endl; }
template <typename T>
void call_foo(T&& t) { foo(FWD(t)); }
int main() {
int a = 10;
foo(10);
foo(a);
call_foo(10);
call_foo(a);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBGV0QodikgXAogICAgc3RkOjpmb3J3YXJkPCBcCiAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8XAogICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxcCiAgICAgICAgZGVjbHR5cGUodik+Ojp0eXBlPjo6dHlwZT4odikKCnZvaWQgZm9vKGludCYgYSkgeyBjb3V0IDw8ICJyZWYiIDw8IGVuZGw7IH0Kdm9pZCBmb28oY29uc3QgaW50JiBhKSB7IGNvdXQgPDwgImNyZWYiIDw8IGVuZGw7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGNhbGxfZm9vKFQmJiB0KSB7IGZvbyhGV0QodCkpOyB9CgppbnQgbWFpbigpIHsKCWludCBhID0gMTA7Cglmb28oMTApOwoJZm9vKGEpOwoJCgljYWxsX2ZvbygxMCk7CgljYWxsX2ZvbyhhKTsKCXJldHVybiAwOwp9Cg==