#include <iostream>
template <typename T>
void foo (T &x) {
std::cout << "non-temporary version: " << x.value() << std::endl;
}
template <typename T>
void foo (const T &x) {
std::cout << "temporary copied to ";
T copy(x);
foo(copy);
}
struct Bar {
const char *value () { return "hi"; }
};
int main ()
{
Bar b;
foo(b);
foo(Bar());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vIChUICZ4KSB7CiAgICBzdGQ6OmNvdXQgPDwgIm5vbi10ZW1wb3JhcnkgdmVyc2lvbjogIiA8PCB4LnZhbHVlKCkgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBmb28gKGNvbnN0IFQgJngpIHsKICAgIHN0ZDo6Y291dCA8PCAidGVtcG9yYXJ5IGNvcGllZCB0byAiOwogICAgVCBjb3B5KHgpOwogICAgZm9vKGNvcHkpOwp9CgpzdHJ1Y3QgQmFyIHsKICAgIGNvbnN0IGNoYXIgKnZhbHVlICgpIHsgcmV0dXJuICJoaSI7IH0KfTsKCmludCBtYWluICgpCnsKICAgIEJhciBiOwogICAgZm9vKGIpOwogICAgZm9vKEJhcigpKTsKICAgIHJldHVybiAwOwp9