[英]Rvalue to forwarding references
我正在阅读参考折叠规则 ,我有一个问题:为什么我将rvalue A传递给
template<typename T>
void foo(T&&);
T推断为A?
例如,如果我将std::string()
传递给函数T
推断为std::string
,为什么不将std::string&&
? 这对我来说更有意义,将T
推断到类型本身背后的理由是什么?
这仅仅与我们通常从模板类型推导出现的预期相符:
template <class T> void vfoo(T );
template <class T> void lfoo(T& );
template <class T> void cfoo(T const& );
template <class T> void ffoo(T&& );
std::string x;
vfoo(x); // deduce T = std::string
lfoo(x); // deduce T = std::string
cfoo(x); // deduce T = std::string
ffoo(x); // deduce T = std::string& !
ffoo(std::move(x)); // deduce T = std::string
从原始论文中强调我的:
当使用与右值引用匹配的左值参数推导出函数模板类型时,该类型被推导为左值引用类型。 当扣除给出一个rvalue参数时, 类型推导就像其他类型一样。
这是一个特殊的左值扣除案例,这就是为什么它在类型扣除规则中得到一个额外的句子。 rvalue案例是典型的 - 它与推导出的类型中粘贴的简单心理模型排列在一起,看看你最终会得到什么功能。 用std::string
调用T&&
? 获取T = std::string
以便参数读取std::string&&
。 校验。
因为函数参数类型上有&&,并且您正在推导表达式的“T”部分。
因此,'将' std::string&&
传递给T&&
会将T
推导为std::string
。
在表达式T&&
中将std::string
替换为T
产生std::string&&
。
它与在表达式T const&
推导T
有点相同; 当通过const引用“传递”一个std::string
, T
部分被推导为std::string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.