以下小示例显示了我的问题:
template<class T> struct X
{
static void xxx(T& x) { }
static void xxx(T&& x) { }
};
int main(int argc, char** argv)
{
int x = 9;
X<int>::xxx(x); // OK.
X<int&>::xxx(x); // ERROR!
return 0;
}
错误信息(GCC):
错误:'static void X::xxx(T&&) [with T = int&]' 不能重载
错误:with 'static void X::xxx(T&) [with T = int&]'</p>
为什么?T = int&
--->T&
替换为int&&
in static void xxx(T& x)
?
如果问题的答案是肯定的,那么:
T&
不是左值引用,而是成为右值引用!- 以下代码应该可以工作:
但它没有:
template<class T> struct X
{
static void xxx(T& x) { }
};
int main(int argc, char** argv)
{
X<int&>::xxx(2); // ERROR!
return 0;
}
错误信息(GCC):
错误:没有匹配函数调用 'X::xxx(int)'<br> 注意:候选者是:static void X::xxx(T&) [with T = int&]
然后T&
withT = int&
不等于T&&
并且不是右值引用。但如果不是,为什么第一个例子不起作用?(这是一个递归问题!)
但是指针类型没有出现类似的问题:
#include <iostream>
template<class T> struct X
{
static void xxx(T* x) { std::cout << **x << std::endl; }
};
int main(int argc, char** argv)
{
int x = 10;
int* xx = &x;
X<int*>::xxx(&xx); // OK. call X<int*>::xxx(int**)
return 0;
}
为什么引用在这种行为中有所不同?