#include <iostream>
struct S
{
// template version
template<class T>
void method(T&& arg)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
// overload
void method(std::string& arg)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
int main()
{
S s;
// will invoke overload : perfect match
std::string str = "Something";
s.method(str);
// but not here
s.method(10);
s.method(20U);
s.method("ref to const array");
// not here either (not lvalue reference).
s.method(std::string("Not here"));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFMKewogICAgLy8gdGVtcGxhdGUgdmVyc2lvbgogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIHZvaWQgbWV0aG9kKFQmJiBhcmcpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsKICAgIH0KICAgIAogICAgLy8gb3ZlcmxvYWQKICAgIHZvaWQgbWV0aG9kKHN0ZDo6c3RyaW5nJiBhcmcpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgUyBzOwogICAgCiAgICAvLyB3aWxsIGludm9rZSBvdmVybG9hZCA6IHBlcmZlY3QgbWF0Y2gKICAgIHN0ZDo6c3RyaW5nIHN0ciA9ICJTb21ldGhpbmciOwogICAgcy5tZXRob2Qoc3RyKTsKICAgIAogICAgLy8gYnV0IG5vdCBoZXJlCiAgICBzLm1ldGhvZCgxMCk7CiAgICBzLm1ldGhvZCgyMFUpOwogICAgcy5tZXRob2QoInJlZiB0byBjb25zdCBhcnJheSIpOwogICAgCiAgICAvLyBub3QgaGVyZSBlaXRoZXIgKG5vdCBsdmFsdWUgcmVmZXJlbmNlKS4KICAgIHMubWV0aG9kKHN0ZDo6c3RyaW5nKCJOb3QgaGVyZSIpKTsKfQo=