假设我有这个功能:
bool f(int&& one, int&& two) { }
如果我尝试使用此代码调用它:
int x = 4;
f(x, 5);
编译器会抱怨它不能将 x 从左值引用转换为右值引用,这是正确的。
现在,如果我将 f 转换为这样的模板函数:
template <class T, class U>
bool f(T&& one, U&& two) { }
然后我可以用左值引用调用它:
int x = 5;
f(x, 5);
为什么会这样?为什么编译器在这种情况下不抱怨?