Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ T&和T&&在模板参数中有什么区别?_C++_Templates_Reference - Fatal编程技术网

C++ 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?

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,但为什么呢?

在第一种情况下,不管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,它不会在编译时出现含糊不清的警告,这正是我所期望的。