模板参数中的 T& 和 T&& 有什么区别?

what is the difference between T& and T&& in template parameter?

本文关键字:什么 区别 参数      更新时间:2023-10-16

T&和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,为什么?

在第一种情况下,无论T是什么,t总是一个左值引用:

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

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

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

调用第二个模板f(g())时,如果g()是左值,则T被推断为左值引用,否则为非引用。

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