网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
c++引用包含左值引用和右值引用,因为引用都是变量,因此右值引用是左值。
左值指变量,右值指临时对象,字面值(16,“string”,13+2)。
当函数参数为T&&时(其中T时模板类型),是万能引用,传入参数是左值,T&&就变成左值引用,否则T&&变成右值引用。
template<typename T> void f(T&& t);
int i=1;//如果i传入,在f内还能改变i的值,故为左值引用。
std::remove_reference<T>
可以去除T的引用
T: int&& -->int;
T: int& --> int;
当模板类型是引用类型,而且函数参数是模板参数的引用的时候会发生引用折叠。
如void func(T&&) ---> 当T==int&
.
A&& & 折叠成 A&
A& & 折叠成 A&
A& && 折叠成 A&
A&& && 折叠成 A&&
也就是说引用类型和函数参数类型只要有一方为左值引用,就折叠成左值引用;如果双方都是右值引用,才折叠成右值引用。
move的作用是将 左值或者右值 强制转换成 右值引用类型。从而可以把左值或右值参数传入相应的函数。
template<class _T>
typename remove_reference<_T>::type&& move(T&& _Arg)
{
return static_cast<typename remove_reference<_T>::type<T>&&>(_Arg);
}
如何工作:
参数T&&保证左值(普通变量,左值引用,右值引用),右值(临时对象)都会进这个函数。
return:
普通变量 --> 临时对象(函数返回值)
临时对象 --> 临时对象(函数返回值)
左值引用 --> 右值引用
右值引用 --> 右值引用
forward是完美转发,保持变量原有的左右值属性。右值参数–>赋值右值引用 --> 右值引用是变量(左值)–> 参数从右值变左值,调相应左值函数。
通过forward。右值参数–>赋值右值引用 --> 右值引用是变量(左值)–>forward将右值引用转成右值–> 参数为右值,调相应左值函数。
void f(int&& i)
{
cout << "r ref" << endl;
}
void f(int& i)
![img](https://img-blog.csdnimg.cn/img_convert/162d055863774fbf758b914ed5d7a7ac.png)
![img](https://img-blog.csdnimg.cn/img_convert/5e6cd0ad3b199491650c115c7ad0c487.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**