繁体   English   中英

Rvalue转发引用

[英]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::stringT部分被推导为std::string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM