我正在阅读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&&
类型本身背后的理由是什么?
答案 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::string
,T
部分推导为std::string
。