Скажем, у меня есть эта функция:
bool f(int&& one, int&& two) { }
Если я попытаюсь вызвать его с помощью этого кода:
int x = 4;
f(x, 5);
компилятор будет жаловаться, что он не может преобразовать x из ссылки lvalue в ссылку rvalue, что является правильным.
Теперь, если я преобразую f в функцию шаблона, например:
template <class T, class U>
bool f(T&& one, U&& two) { }
то я могу вызвать его с помощью ссылки lvalue:
int x = 5;
f(x, 5);
Почему так? Почему компилятор не жалуется в этом случае?