以下的小例子的參考變量顯示我的問題:問題通過模板參數
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):
error: ‘static void X::xxx(T&&) [with T = int&]’ cannot be overloaded
error: with ‘static void X::xxx(T&) [with T = int&]’
爲什麼呢? T = int&
--->T&
取代int&&
在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):
error: no matching function for call to ‘X::xxx(int)’
note: candidates are: 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;
}
爲什麼引用是這種行爲有什麼不同?
我的頭很疼。很多&符號。 – 2010-08-22 17:51:37
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&& @詹姆斯&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& – GManNickG 2010-08-22 18:05:46