模板的类型推导,不能推导出"引用"的信息吗?

ewrewqr2 2015-10-07 07:44:51
如下:

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++语言的标准对此说了什么吗?
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2015-10-08
  • 打赏
  • 举报
回复
都推导成 int,引用的话需要明确写 &
lm_whales 2015-10-08
  • 打赏
  • 举报
回复
C++ 函数(包括模板)匹配,是按照调用方式,和对应的函数匹配的 引用和值调用形式完全一致, 模板匹配的时候,值调用 优先匹配,所以引用方式就没有机会了。 模板匹配的时候,C++引用信息没有丢失,只是机会差点,很多时候,匹配不上而已。
lm_whales 2015-10-08
  • 打赏
  • 举报
回复
是 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;
}
试试
mymtom 2015-10-08
  • 打赏
  • 举报
回复
f函数是传值的,不是引用
mymtom 2015-10-08
  • 打赏
  • 举报
回复
引用 2 楼 mymtom 的回复:
f函数是传值的,不是引用
所以函数 f 里的 t += 1; 真的没有用处。
dustpg 2015-10-07
  • 打赏
  • 举报
回复
#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;
}

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧