为什么T不会推论到int&&这里

时间:2016-10-10 14:32:10

标签: c++ templates rvalue

以下是功能模板

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&安培;&安培;这对我来说也很有意义!

2 个答案:

答案 0 :(得分:7)

  

为什么T不会推断为int&&

如果模板参数是引用,则在考虑如何进行演绎之前,通常会删除引用(例外情况是在针对左值,函数和数组推导时转发引用)。

在这种情况下,T是针对4推断出来的,intT,因此int推断为T&&。生成的类型int&&4

请注意,表达式永远不会有引用类型。 intint&&类型的右值,它不是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