为什么T &&实例化为int&?

Let*_*_Be 11 c++ templates forwarding rvalue-reference c++11

任何人都可以解释为什么这个编译,为什么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);
}
Run Code Online (Sandbox Code Playgroud)

我在GCC 4.5.0 20100604和GDB 7.2-60.2上看到了这一点

Joh*_*itb 17

由于完美转发,当参数为P&&左值时,P则会推导出参数的类型加上&附加值.所以你得到int & &&P存在int&.如果参数是一个右值,然后P将被推断为仅参数的类型,所以你得到一个int&&论据与Pint,如果你会通过,例如0直接.

int& &&将崩溃到int&(这是一个语义视图 - 语法上int& &&是非法的.但是说U &&何时U是模板参数或typedef 引用类型int&,然后U&&仍然是类型int&- 即两个引用"崩溃"到一个左值引用).这就是为什么t有类型int&.