C++ T&和T&&在模板参数中有什么区别?
T&和T&&在模板参数中有什么区别?例如:C++ T&和T&&在模板参数中有什么区别?,c++,templates,reference,C++,Templates,Reference,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?
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,但为什么呢?在第一种情况下,不管T是什么,T总是一个左值引用:
T = U => T & = U &
T = U & => T & = U &
T = U && => T & = U &
在第二种情况下,t可以是左值或右值引用。换句话说,t总是一个引用,但它可以绑定到任何参数。这是一个:
当您调用第二个模板fg时,如果g是左值,则将T推断为左值引用,否则将T推断为非引用
在您的示例fa中,由于a是左值,因此T被推导为int&,因此T&&=int&,因此函数参数T被绑定到对象a,然后对其进行修改。在第一种情况下,无论T是什么,T始终是左值引用:
T = U => T & = U &
T = U & => T & = U &
T = U && => T & = U &
在第二种情况下,t可以是左值或右值引用。换句话说,t总是一个引用,但它可以绑定到任何参数。这是一个:
当您调用第二个模板fg时,如果g是左值,则将T推断为左值引用,否则将T推断为非引用
在您的示例fa中,由于a是左值,T被推导为int&,因此T&&=int&,因此函数参数T被绑定到对象a,然后您对其进行修改。我不确定我是否理解正确。请参阅我的示例测试。谢谢。添加了指向Scott Meyers关于通用参考文献的链接,不确定这是否是最好的,但它是有意义的。@user1899020:我添加了一个针对您的示例的句子。我不确定我是否理解正确。请参阅我的示例测试。谢谢。添加了有关通用参考的Scott Meyers的链接,不确定这是否是最好的,但它是有意义的。@user1899020:我添加了一个针对您的示例的句子。这是使用什么编译器,我刚刚修改了gcc 4.8.1,它不会编译时出现含糊不清的警告,这正是我所期望的。这是使用什么编译器,我刚刚修改了GCC4.8.1,它不会在编译时出现含糊不清的警告,这正是我所期望的。