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,为什么?
答案 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
,然后进行修改。