【发布时间】:2010-08-22 17:27:44
【问题描述】:
下面的小例子说明了我的问题:
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&]' 不能重载
错误:带有'static void X::xxx(T&) [with T = int&]'
为什么? T = int& ---> T& 在static void xxx(T& x) 中被int&& 替换了吗?
如果问题的答案是肯定的,那么:
-
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)’
注意:候选人是:static void X::xxx(T&) [with T = int&]
那么T& 和T = 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;
}
为什么引用在这种行为中有所不同?
【问题讨论】:
-
我的头好痛。这么多和号。
-
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&& @詹姆斯&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 跨度>
标签: c++ templates c++11 rvalue-reference lvalue