Rvalue转发引用

时间:2016-03-30 11:29:04

标签: c++ c++11

我正在阅读reference collapsing rules,我有一个问题:为什么我将右值A 传递给

alter table t alter column col4 type decimal(4,1);
alter table t alter column col5 type decimal(4,1);

T推断为A?

e.g。如果我将template<typename T> void foo(T&&); 传递给函数std::string(),则推断为T,为什么不std::string?这对我来说更有意义,推断std::string&&类型本身背后的理由是什么?

2 个答案:

答案 0 :(得分:11)

这仅仅符合我们对模板类型推导的一般预期:

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

来自the original paper,强调我的:

  

当使用与右值引用匹配的左值参数推导出函数模板类型时,该类型被推导为左值引用类型。当推导出rvalue参数时,类型推导就像其他类型一样。

左倾扣除案例是特殊情况,这就是它在类型扣除规则中得到额外句子的原因。 rvalue案例是典型的 - 它与推导出的类型中粘贴的简单心理模型排列在一起,看看你最终会得到什么功能。使用T&&调用std::string?获取T = std::string以使参数显示为std::string&&。校验。

答案 1 :(得分:3)

因为函数参数类型有&amp;&amp;在它上面,你正在推断出&#39; T&#39;表达的一部分。

所以,&#39;传递&#39; std::string&&T&&会将T推断为std::string

std::string表达式中将T替换为T&&会产生std::string&&

与推断表达式T中的T const&有点相同;什么时候过去&#39;通过const引用std::stringT部分推导为std::string