#include<string>
#include<iostream>
template <std::string * temp> //pointer to object
void f()
{
std::cout << *temp << std::endl;
}
template <std::string & temp> //reference to object
void g()
{
std::cout << temp << std::endl;
temp += "...appended some string";
}
std::string s; //must not be local as it must have external linkage! WHY???
int main() {
s = "can assign values locally";
f<&s>();
g<s>();
std::cout << s << std::endl;
return 0;
}
I2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxpb3N0cmVhbT4KCnRlbXBsYXRlIDxzdGQ6OnN0cmluZyAqIHRlbXA+IC8vcG9pbnRlciB0byBvYmplY3QKdm9pZCBmKCkKewogICBzdGQ6OmNvdXQgPDwgKnRlbXAgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8c3RkOjpzdHJpbmcgJiB0ZW1wPiAvL3JlZmVyZW5jZSB0byBvYmplY3QKdm9pZCBnKCkKewogICAgIHN0ZDo6Y291dCA8PCB0ZW1wIDw8IHN0ZDo6ZW5kbDsKICAgICB0ZW1wICs9ICIuLi5hcHBlbmRlZCBzb21lIHN0cmluZyI7Cn0KCnN0ZDo6c3RyaW5nIHM7IC8vbXVzdCBub3QgYmUgbG9jYWwgYXMgaXQgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2UhIFdIWT8/PwoKaW50IG1haW4oKSB7CiAgICAgICAgcyA9ICJjYW4gYXNzaWduIHZhbHVlcyBsb2NhbGx5IjsKICAgICAgICBmPCZzPigpOwogICAgICAgIGc8cz4oKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDA7Cn0=