如下:
template<class T> void f(T t) { //cout << std::is_reference<T>::type << endl; //remove_reference<T>::type t2 = t; //t2 += 2; t += 1; } int main() { int i = 1; f(i); cout << i << endl; int&ri = i; f(ri); cout << i << endl; return 0; }
我期待,模板函数f,在接受int i的时候推导出T=int,那么t是i的一个拷贝,对它加1不会有影响。
而在接受int& ri参数时,能推导出int&,也就是t是i的一个引用,对t加1就是对i加1.
所以我期待输出结果是1,2
但是实际上输出的结果是1,1
换句话说,似乎模板的类型推导,如果没有显示的声明T&这样的话,那么似乎是会丢掉变量的引用修饰符的。
C++语言的标准对此说了什么吗?
解决方案:10分
#include <iostream> #include <typeinfo> int main() { int a = 9; int&b = a; std::cout << "a: " << typeid(a).name() << std::endl; std::cout << "b: " << typeid(b).name() << std::endl; return 0; }
解决方案:5分
f函数是传值的,不是引用
解决方案:10分
所以函数 f 里的 t += 1; 真的没有用处。
解决方案:5分
是 int 比 int &更优先匹配,所以推导不到 int&
int 和 int & 实参,都是优先匹配 int 而非 int &
你改成
template<class T> void f(T& t) { //cout << std::is_reference<T>::type << endl; //remove_reference<T>::type t2 = t; //t2 += 2; t += 1; }
试试
解决方案:5分
C++ 函数(包括模板)匹配,是按照调用方式,和对应的函数匹配的
引用和值调用形式完全一致,
模板匹配的时候,值调用 优先匹配,所以引用方式就没有机会了。
模板匹配的时候,C++引用信息没有丢失,只是机会差点,很多时候,匹配不上而已。
解决方案:5分
都推导成 int,引用的话需要明确写 &