#include #include #include int select(int&) { return 1; } int select(const int&) { return 2; } int select(int&&) { return 3; } template int relay(T&& x) { return select(std::forward(x)); } template int named(T&& x) { return select(x); } int main() { int n = 1; const int c = 2; assert(relay(n) == 1); assert(relay(c) == 2); assert(relay(3) == 3); assert(named(3) == 1); std::cout << relay(n) << ' ' << relay(c) << ' ' << relay(3) << '\n'; }