为什么在代码const左值和右值下面调用const T& t
而不是T&& t
?
在C ++入门第五版(第16章)中,提到两个模板功能可行时,编译器应选择更专业的版本。
这是我的分析:
对于const int&& i = r * 3;
右值
T&& t
:T
已绑定到const int
const T&
:T
已绑定到int
对于const int& j = 10;
左值
T&& t
:根据间接右值引用传递规则T
绑定到const int &
const T&
:T
已绑定到int
所以我正在考虑使用const lvalue / rvalue引用,采用rvalue引用的模板函数和采用lvalue引用的函数都是可行的。因此,应该选择右值引用,但事实并非如此。那么我的分析有什么问题呢?
template<typename T>
void debug(T&& t) {
cout << " in T&& t " << endl;
}
template<typename T> void func(const T& t) {
cout << " in const T& t" << endl;
}
int r = 1;
debug(r); // print in T&& t;
const int&& i = r * 3;
debug(i); //print in const T& t
const int& j = 10;
debug(j); //print in const T& t