BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #93881同步于 2016/11/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

有关参数传递的困惑

liuyehcf
2016/11/14镜像同步10 回复
C++ Primer(5) P613有如下一句话 "如果一个函数是指向模板类型参数的右值引用(如T &&),它对应的实参的const属性和左值/右值属性将得到保持" 定义如下函数模板 ```C template<typename T> void func(T&& t){ anotherFunc(std::forward<T>(t)); } ``` 我的疑惑 1、形参列表为(T&& t),那么形参t作为一个"变量表达式",它一定是个左值,那么它如何保持实参的左右值属性? 由于t一定是一个引用类型,要么是左值引用,要么是右值引用,难道是将"表达式的左右值属性"转移到"变量的类型"中去? 2、为什么要实现完美转发还需要利用std::forward? 因为既然t是一个绑定到实参的引用类型,那么调用anotherFunc时,传入t不就等于直接传入了实参么,即anotherFunc(t);
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
bluewindwty机器人#1 · 2016/11/14
1. 事实上C++11有引用折叠的规定:"&& &", "& &&","& &"这三种情况参数都会推导成左值引用,只有“&& &&”会被推导成右值引用。可以代入t尝试一下,t本身的左右值属性一定会被保留
specops机器人#2 · 2016/11/14
t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。 【 在 liuyehcf (安静的牛皮糖) 的大作中提到: 】 : C++ Primer(5) P613有如下一句话 : "如果一个函数是指向模板类型参数的右值引用(如T &&),它对应的实参的const属性和左值/右值属性将得到保持" : ...................
specops机器人#3 · 2016/11/14
完美转发就是为了保留t所引用对象的左值/右值属性,否则只会调用左值版本的重载 【 在 specops (Perfec) 的大作中提到: 】 : t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。
ray19950624机器人#4 · 2016/11/14
不懂,绑定!膜拜六爷
liuyehcf机器人#5 · 2016/11/14
谢谢~ 是不是对于anotherFunc(t)这次函数调用,实参的左/右值属性就是一定是左值?因为变量表达式t就是一个左值? 【 在 specops 的大作中提到: 】 : 完美转发就是为了保留t所引用对象的左值/右值属性,否则只会调用左值版本的重载
liuyehcf机器人#6 · 2016/11/14
【 在 ray19950624 的大作中提到: 】 : 不懂,绑定!膜拜六爷
liuyehcf机器人#7 · 2016/11/14
谢谢~ 我疑惑的地方不是引用折叠,而是实参的左右值属性如何被t保留 比方说传入一个右值(类型A),函数模板推断出的模板实参为 T=A,那么t的类型就是T&&=A&&,即A类型的右值引用 相当于本属于一个表达式的"左/右值属性",变成了类型中的"左值引用/右值引用",但t本身还是左值 【 在 bluewindwty 的大作中提到: 】 : 1. 事实上C++11有引用折叠的规定:"&& &", "& &&","& &"这三种情况参数都会推导成左值引用,只有“&& &&”会被推导成右值引用。可以代入t尝试一下,t本身的左右值属性一定会被保留
liuyehcf机器人#8 · 2016/11/14
谢谢~ 我的疑问不在于形参t的类型的推导~ 【 在 specops 的大作中提到: 】 : t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。
specops机器人#9 · 2016/11/14
是。不用谢。 【 在 liuyehcf (安静的牛皮糖) 的大作中提到: 】 : 谢谢~ : 是不是对于anotherFunc(t)这次函数调用,实参的左/右值属性就是一定是左值?因为变量表达式t就是一个左值?