#include <iostream>
#include <vector>
using namespace std;
template<typename T>
struct NotARef { typedef void type; };
template<typename T>
struct NotARef<T&> { }; // specialize for references, such that the type member doesn't exist.
template <class T>
void foo(const T& )
{cout << "void foo(const T&)" << endl;}
template <class T, typename x = typename NotARef<T>::type >
void foo(T&& ) // Now, thanks to NotARef, this will be called only for rvalues
{cout << "void foo(T&&)" << endl;}
int main()
{
vector<int> x;
foo(x); // Calls foo(const T&) as desired
foo(vector<int>()); // void foo(T&&)
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgTm90QVJlZiB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgTm90QVJlZjxUJj4geyB9OyAvLyBzcGVjaWFsaXplIGZvciByZWZlcmVuY2VzLCBzdWNoIHRoYXQgdGhlIHR5cGUgbWVtYmVyIGRvZXNuJ3QgZXhpc3QuCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCBmb28oY29uc3QgVCYgKQp7Y291dCA8PCAidm9pZCBmb28oY29uc3QgVCYpIiA8PCBlbmRsO30KdGVtcGxhdGUgPGNsYXNzIFQsIHR5cGVuYW1lIHggPSB0eXBlbmFtZSBOb3RBUmVmPFQ+Ojp0eXBlID4Kdm9pZCBmb28oVCYmICkgLy8gTm93LCB0aGFua3MgdG8gTm90QVJlZiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciBydmFsdWVzCntjb3V0IDw8ICJ2b2lkIGZvbyhUJiYpIiA8PCBlbmRsO30KCmludCBtYWluKCkKewogICAgICAgIHZlY3RvcjxpbnQ+IHg7CiAgICAgICAgZm9vKHgpOyAvLyBDYWxscyBmb28oY29uc3QgVCYpIGFzIGRlc2lyZWQKICAgICAgICBmb28odmVjdG9yPGludD4oKSk7IC8vIHZvaWQgZm9vKFQmJikKfQo=