为什么 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&&
。
请注意,表达式永远不会有引用类型。 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&>
为什么要推导到int&&
?请注意,参数的类型是 T &&
,而不是 T
。所以:
- 所需的参数最终类型(类型推导的乘积)是
int &&
。
- 参数的形式为
T &&
。
- 什么是最简单的
T
使得T &&
是int &&
?
答案:int
.
以下是函数模板
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 toint&&
?
如果模板参数是一个引用,那么在您考虑推导方式之前通常会删除该引用(例外情况是在针对左值、函数和数组推导时转发引用)。
在这种情况下,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&>
为什么要推导到int&&
?请注意,参数的类型是 T &&
,而不是 T
。所以:
- 所需的参数最终类型(类型推导的乘积)是
int &&
。 - 参数的形式为
T &&
。 - 什么是最简单的
T
使得T &&
是int &&
?
答案:int
.