谁能解释一下为什么会编译,为什么 t
会以 int&
类型结束?
#include <utility>
void f(int& r)
{
++r;
}
template <typename Fun, typename T>
void g(Fun fun, T&& t)
{
fun(std::forward<T>(t));
}
int main()
{
int i = 0;
g(f, i);
}
我在 GCC 4.5.0 20100604 和 GDB 7.2-60.2 上看到了这个
最佳答案
因为完美转发,当 P&&
的参数是一个左值时,P
将被推导为参数的类型加上一个 &
附上。所以你得到 int & &&
,其中 P
是 int&
。如果参数是右值,则 P
将仅推导为参数的类型,因此您将得到一个带有 P 的
是 int&&
参数int
如果你会通过,例如 0
直接。
int& &&
将折叠为 int&
(这是语义 View - 从语法上讲 int& &&
是非法的。但是说 U &&
当 U
是模板参数或引用类型 int&
的 typedef 时,U&&
仍然是类型 int&
- 即两个引用“折叠”到一个左值引用)。这就是 t
的类型为 int&
的原因。
关于c++ - 为什么T&&实例化为int&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327730/