#include <bits/stdc++.h>
#include <typeinfo>
using namespace std;
void show(string r,string t){printf("ref='%s'; tmp='%s';\n",r.c_str(),t.c_str());}
template<class TYPE>
void foo(TYPE&ref,bool a,bool b){
TYPE tmp=ref; // <---- тут беда, если foo звать как foo<T&>(...);
if(a)tmp="a";
if(b)ref="b";
show(ref,tmp);cout<<__PRETTY_FUNCTION__;
}
int main(){
#define F(CODE){string s="s";printf("%s // ",#CODE);CODE;}
F( foo<string&>(s,1,0); );
F( foo<string >(s,1,0); );
F( foo<string&>(s,0,1); );
F( foo<string >(s,0,1); );
F( foo<string&>(s,1,1); );
F( foo<string >(s,1,1); );
#undef F
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx0eXBlaW5mbz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdm9pZCBzaG93KHN0cmluZyByLHN0cmluZyB0KXtwcmludGYoInJlZj0nJXMnOyB0bXA9JyVzJztcbiIsci5jX3N0cigpLHQuY19zdHIoKSk7fQp0ZW1wbGF0ZTxjbGFzcyBUWVBFPgp2b2lkIGZvbyhUWVBFJnJlZixib29sIGEsYm9vbCBiKXsKICBUWVBFIHRtcD1yZWY7IC8vIDwtLS0tINGC0YPRgiDQsdC10LTQsCwg0LXRgdC70LggZm9vINC30LLQsNGC0Ywg0LrQsNC6IGZvbzxUJj4oLi4uKTsKICBpZihhKXRtcD0iYSI7CiAgaWYoYilyZWY9ImIiOwogIHNob3cocmVmLHRtcCk7Y291dDw8X19QUkVUVFlfRlVOQ1RJT05fXzsKfQppbnQgbWFpbigpewogICNkZWZpbmUgRihDT0RFKXtzdHJpbmcgcz0icyI7cHJpbnRmKCIlcyAvLyAiLCNDT0RFKTtDT0RFO30KICBGKCAgZm9vPHN0cmluZyY+KHMsMSwwKTsgICk7CiAgRiggIGZvbzxzdHJpbmcgPihzLDEsMCk7ICApOwogIEYoICBmb288c3RyaW5nJj4ocywwLDEpOyAgKTsKICBGKCAgZm9vPHN0cmluZyA+KHMsMCwxKTsgICk7CiAgRiggIGZvbzxzdHJpbmcmPihzLDEsMSk7ICApOwogIEYoICBmb288c3RyaW5nID4ocywxLDEpOyAgKTsKICAjdW5kZWYgRgp9
foo<string&>(s,1,0); // ref='a'; tmp='a';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char> &]foo<string >(s,1,0); // ref='s'; tmp='a';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char>]foo<string&>(s,0,1); // ref='b'; tmp='b';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char> &]foo<string >(s,0,1); // ref='b'; tmp='s';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char>]foo<string&>(s,1,1); // ref='b'; tmp='b';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char> &]foo<string >(s,1,1); // ref='b'; tmp='a';
void foo(TYPE &, bool, bool) [TYPE = std::__cxx11::basic_string<char>]