为什么左值可以传给右值引用

booirror 2015-04-05 02:49:48

template<class T>
func(T&& t)
{
....
}

然后如下调用:
int a = 4;
func(a);

非常ok,不报错,我真是纳闷,这是为什么
...全文
312 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈利_蜘蛛侠 2015-04-06
  • 打赏
  • 举报
回复
你可以这么理解:如果不能将变量a直接作为你那个函数的实参的话,那么为了成功地调用那个函数,你就要生生地造出一个右值表达式,比如说a+0,而这显然是不方便的。所以int&& 是兼容int&的参数的。 当然,如果你另外定义了一个以int&为形参的重载函数的话,用a做实参时,就会调用int&为形参的重载函数版本了。
jiht594 2015-04-05
  • 打赏
  • 举报
回复
引用 4 楼 booirror 的回复:
[quote=引用 1 楼 jiht594 的回复:] 你哪里看到不能用左值的?
因为左值不能赋值给右值引用类型的变量[/quote] 这里有一个推导的过程. 看一下2楼连接, 4.3 模板参数类型推导 这节
booirror 2015-04-05
  • 打赏
  • 举报
回复
引用 1 楼 jiht594 的回复:
你哪里看到不能用左值的?
因为左值不能赋值给右值引用类型的变量
ri_aje 2015-04-05
  • 打赏
  • 举报
回复
这是为了照顾 perfect forwarding,最后推倒的类型是 int&,能够成功绑定。
jiht594 2015-04-05
  • 打赏
  • 举报
回复
http://zh.wikipedia.org/wiki/右值引用#.E5.BC.95.E7.94.A8.E5.A1.8C.E7.BC.A9.E8.A7.84.E5.88.99 4.2 引用塌缩规则 4.3 模板参数类型推导 4.4 完美转发的解决方案 6 右值引用的类型推导 6.1 auto关键字的类型完美转发 6.2 typedef的类型推导 6.3 decltype类型推导
jiht594 2015-04-05
  • 打赏
  • 举报
回复
你哪里看到不能用左值的?

64,653

社区成员

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

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