以下是功能模板
template <class T>
void func(T&& t) {
}
func(4); // 4 is rvalue and T deduces to int
所以我的问题是为什么T没有演绎到int&amp;&amp; ?
我的意思是如果T推断为int&amp;&amp;
以便int&amp;&amp; &安培;&安培; - &GT; INT&安培;&安培;这对我来说也很有意义!
答案 0 :(得分:7)
为什么
T
不会推断为int&&
?
如果模板参数是引用,则在考虑如何进行演绎之前,通常会删除引用(例外情况是在针对左值,函数和数组推导时转发引用)。
在这种情况下,T
是针对4
推断出来的,int
是T
,因此int
推断为T&&
。生成的类型int&&
为4
。
请注意,表达式永远不会有引用类型。 int
是int&&
类型的右值,它不是template <class T> void foo(T );
template <class T> void bar(T const& );
foo(4); // calls foo<int>, not foo<int&&>
bar(4); // calls bar<int>, not bar<int const&>
。
这与演绎的工作方式一致:
{{1}}
答案 1 :(得分:7)
为什么要推断到int&&
?请注意,参数的类型为T &&
,而不是T
。所以:
int &&
。T &&
。T
是什么T &&
是int &&
?答案:int
。