免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2817 | 回复: 8

[C++] 函数参数双&修饰参数类型是什么意思? [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 12:26 |显示全部楼层
比如void f(int&&),这是什么意思?是C++11的新特性还是VS自己扩展的?我在VS2012的vector代码里面看到的。
我搜了下,说是用于什么右值引用,是不是就是这么个用法:
这样写f(5)就可以过编译,用于替代这种写法,“void f(int&),然后f((int&)(const int&)5)”。
以及class A和void f(A&&),f(A())这样就可以了,而不需要f((A&)(const A&)A())。
不过这个到底是VS自己搞出来的,还是C++11啊?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 16:13 |显示全部楼层
这么久都没人回,我猜测应该不是11标准了,估计是VS自己扩展的……

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2014-02-19 16:21 |显示全部楼层
回复 1# w_anthony


    &&的确是C++11标准的一部分,称为rvalue reference,主要是为了解决不必要的临时对象开销以及深度copy,配合move使用可以使用的STL的容器更加高效。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 16:26 |显示全部楼层
回复 3# myworkstation


    谢谢,不过它出现的意义,是否是解决我上面提到的那两种情况?
有没有其它用法?是否都用来修饰函数参数类型的?有没有用来修饰返回值之类的其它用法?
对这个比较陌生,C++11现在是用不到,不过既然遇到了就想了解一下。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-19 16:30 |显示全部楼层
我目前的感觉是“在函数内使用&&声明的对象,与引用的使用方法没有什么不同”,可能汇编代码的原理也没有什么不同,只是在使用这个函数时,这个函数可以更友好的接受右值参数,比如f(5)和f(A())这样的,这是引用所做不到的,是否仅此而已?

论坛徽章:
2
酉鸡
日期:2014-01-09 13:24:252015年亚洲杯之阿曼
日期:2015-02-13 00:43:51
发表于 2014-02-19 19:34 |显示全部楼层
w_anthony 发表于 2014-02-19 16:30
我目前的感觉是“在函数内使用&&声明的对象,与引用的使用方法没有什么不同”,可能汇编代码的原理也没有什 ...

它出现的目的已经有人说了,是为了解决不必要的临时对象开销以及深度copy

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2014-02-20 07:48 |显示全部楼层
回复 5# w_anthony


    好像仅此而已
f(“aaa")要写成 f(std::string("aaa"))
的确很难看。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2014-02-20 09:21 |显示全部楼层
回复 7# folklore


    谢谢,感觉更像个语法糖,就算没有它,如果要“解决不必要的临时对象开销以及深度copy”,那也可以写成(A&)(const A&)也就是难看一点,效率上面没有差别。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2014-02-20 12:07 |显示全部楼层
回复 8# w_anthony


    你说的问题其实只看到了rvalue,lvalue,而c++ 11中又作了细分:lvalue,xvalue(expiring value),prvalue(pure rvalue),glvalue(general lvalue),rvalue。右值引用解决的是xvalue的问题,而常引用解决的是prvalue的问题,它们是有区别的。最典型和直接的能说明问题的应用场景我觉得应该是c++ 11的新stl容器的emplace系列的方法。建议你去看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP