#include <bits/stdc++.h>
#include <typeinfo>
using namespace std;
#define impl(TYPE,ref){cout<<"TYPE=string";check(TYPE);cout<<"decltype(ref)=string";check(decltype(ref));cout<<"\n";}
#define check(t){\
if(std::is_rvalue_reference<t>::value)cout<<"&&";\
if(std::is_lvalue_reference<t>::value)cout<<"&";\
if(std::is_reference<t>::value)cout<<"ref";\
cout<<"; ";\
}
#define combine0(a,b)a##b
#define combine(a,b)combine0(a,b)
#define bar(gcc_preproc_is_stupid_bullshit)bar(combine(TYPE,&ref))
using TYPE=string&;
void foo(TYPE&ref){impl(TYPE,ref);}
template<class TYPE=string&> // ...
void baz(TYPE&ref){impl(TYPE,ref);}
#define TYPE string&
void bar(TYPE&ref){impl(TYPE,ref);}
#undef bar
int main(){
#define F(CODE){string s="s";printf("%s // ",#CODE);CODE;}
auto foo_string_ref=foo;
F( foo_string_ref(s); );
F( baz<string&>( s ); );
F( bar(std::move(s)); );
#undef F
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx0eXBlaW5mbz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgaW1wbChUWVBFLHJlZil7Y291dDw8IlRZUEU9c3RyaW5nIjtjaGVjayhUWVBFKTtjb3V0PDwiZGVjbHR5cGUocmVmKT1zdHJpbmciO2NoZWNrKGRlY2x0eXBlKHJlZikpO2NvdXQ8PCJcbiI7fQoKI2RlZmluZSBjaGVjayh0KXtcCiAgaWYoc3RkOjppc19ydmFsdWVfcmVmZXJlbmNlPHQ+Ojp2YWx1ZSljb3V0PDwiJiYiO1wKICBpZihzdGQ6OmlzX2x2YWx1ZV9yZWZlcmVuY2U8dD46OnZhbHVlKWNvdXQ8PCImIjtcCiAgaWYoc3RkOjppc19yZWZlcmVuY2U8dD46OnZhbHVlKWNvdXQ8PCJyZWYiO1wKICBjb3V0PDwiOyAiO1wKfQoKI2RlZmluZSBjb21iaW5lMChhLGIpYSMjYgojZGVmaW5lIGNvbWJpbmUoYSxiKWNvbWJpbmUwKGEsYikKI2RlZmluZSBiYXIoZ2NjX3ByZXByb2NfaXNfc3R1cGlkX2J1bGxzaGl0KWJhcihjb21iaW5lKFRZUEUsJnJlZikpCgp1c2luZyBUWVBFPXN0cmluZyY7CnZvaWQgZm9vKFRZUEUmcmVmKXtpbXBsKFRZUEUscmVmKTt9Cgp0ZW1wbGF0ZTxjbGFzcyBUWVBFPXN0cmluZyY+IC8vIC4uLgp2b2lkIGJheihUWVBFJnJlZil7aW1wbChUWVBFLHJlZik7fQoKI2RlZmluZSBUWVBFIHN0cmluZyYKdm9pZCBiYXIoVFlQRSZyZWYpe2ltcGwoVFlQRSxyZWYpO30KCiN1bmRlZiBiYXIKaW50IG1haW4oKXsKICAjZGVmaW5lIEYoQ09ERSl7c3RyaW5nIHM9InMiO3ByaW50ZigiJXMgLy8gIiwjQ09ERSk7Q09ERTt9CiAgYXV0byBmb29fc3RyaW5nX3JlZj1mb287CiAgRiggIGZvb19zdHJpbmdfcmVmKHMpOyAgKTsKICBGKCAgYmF6PHN0cmluZyY+KCBzICk7ICApOwogIEYoICBiYXIoc3RkOjptb3ZlKHMpKTsgICk7CiAgI3VuZGVmIEYKfQ==