T& T之间有什么区别?和T&&在模板参数?

时间:2014-05-24 11:32:35

标签: c++ templates reference

T& S之间有什么区别?和T&&在模板参数?例如:

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

我尝试了代码

template<class T>
void f(T&& t)
{
    t = 5;
}

int main()
{
    int a = 0;
    f(a); //a == 5 why?        
    return 0;
}

我希望a = 0但= = 5,为什么?

1 个答案:

答案 0 :(得分:5)

在第一种情况下,无论T是什么,t始终是左值参考:

T = U     =>   T & = U &
T = U &   =>   T & = U &
T = U &&  =>   T & = U &

在第二种情况下,t可能是左值右值参考。换句话说,t 总是一个引用,但它可以绑定到任何参数。这是一个"universal" reference

T = U     =>   T && = U &&
T = U &   =>   T && = U &
T = U &&  =>   T && = U &&

当您拨打第二个模板f(g())时,如果T是左值,则g()会被推导为左值参考,否则会推断为非参考。

在您的示例f(a)中,由于a是左值,T被推断为int &,因此T && = int &,因此函数参数{{ 1}}绑定到对象t,然后进行修改。