为什么 T 在这里不推导为 int&&

why T does not deduce to int&& here

以下是函数模板

template <class T>
void func(T&& t) {
}

func(4); // 4 is rvalue and T deduces to int

所以我的问题是为什么 T 不推导出 int&& ?

我的意思是如果 T 推导为 int&&

所以 int&& && -> int&& 这对我来说也很有意义!

why T does not deduce to int&& ?

如果模板参数是一个引用,那么在您考虑推导方式之前通常会删除该引用(例外情况是在针对左值、函数和数组推导时转发引用)。

在这种情况下,T 被推导为 4,这是一个 int,因此 T 推导为 int。结果类型 T&&int&&

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

为什么要推导到int&&?请注意,参数的类型是 T &&,而不是 T。所以:

  • 所需的参数最终类型(类型推导的乘积)是int &&
  • 参数的形式为T &&
  • 什么是最简单的T使得T &&int &&

答案:int.