返回信息流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);
这是一条镜像帖。来源:北邮人论坛 / cpp / #93881同步于 2016/11/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
有关参数传递的困惑
liuyehcf
2016/11/14镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1. 事实上C++11有引用折叠的规定:"&& &", "& &&","& &"这三种情况参数都会推导成左值引用,只有“&& &&”会被推导成右值引用。可以代入t尝试一下,t本身的左右值属性一定会被保留
t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。
【 在 liuyehcf (安静的牛皮糖) 的大作中提到: 】
: C++ Primer(5) P613有如下一句话
: "如果一个函数是指向模板类型参数的右值引用(如T &&),它对应的实参的const属性和左值/右值属性将得到保持"
: ...................
完美转发就是为了保留t所引用对象的左值/右值属性,否则只会调用左值版本的重载
【 在 specops (Perfec) 的大作中提到: 】
: t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。
谢谢~
是不是对于anotherFunc(t)这次函数调用,实参的左/右值属性就是一定是左值?因为变量表达式t就是一个左值?
【 在 specops 的大作中提到: 】
: 完美转发就是为了保留t所引用对象的左值/右值属性,否则只会调用左值版本的重载
谢谢~
我疑惑的地方不是引用折叠,而是实参的左右值属性如何被t保留
比方说传入一个右值(类型A),函数模板推断出的模板实参为 T=A,那么t的类型就是T&&=A&&,即A类型的右值引用
相当于本属于一个表达式的"左/右值属性",变成了类型中的"左值引用/右值引用",但t本身还是左值
【 在 bluewindwty 的大作中提到: 】
: 1. 事实上C++11有引用折叠的规定:"&& &", "& &&","& &"这三种情况参数都会推导成左值引用,只有“&& &&”会被推导成右值引用。可以代入t尝试一下,t本身的左右值属性一定会被保留
谢谢~
我的疑问不在于形参t的类型的推导~
【 在 specops 的大作中提到: 】
: t是左值没错,但到底是左值引用还是右值引用要按一定规则推导。
是。不用谢。
【 在 liuyehcf (安静的牛皮糖) 的大作中提到: 】
: 谢谢~
: 是不是对于anotherFunc(t)这次函数调用,实参的左/右值属性就是一定是左值?因为变量表达式t就是一个左值?