C++中的万能引用和完美转发
- 阅读这篇博文需要了解C++中的左值(lvalue)和右值(rvalue)的概念,详情参见我的另外一篇博文:C++移动语义及拷贝优化
- 万能引用和完美转发多涉及到模板的使用,如若不是自己写模板,则可不用关心
万能引用(Universal Reference)
首先,我们来看一个例子:
#include <iostream>
using std::cout;
using std::endl;
template<typename T>
void func(T& param) {
cout << param << endl;
}
int main() {
int num = 2019;
func(num);
return 0;
}
这样例子的编译输出都没有什么问题,但是如果我们修改成下面的调用方式呢?
int main() {
func(2019);
return 0;
}
则会得到一个大大的编译错误。因为上面的模板函数只能接受左值或者左值引用(左值一般是有名字的变量,可以取到地址的),我们当然可以重载一个接受右值的模板函数,如下也可以达到效果。
template<typename T>

本文介绍了C++中的万能引用(Universal Reference)和完美转发(Perfect Forwarding)概念,以及引用折叠(Reference Collapse)规则。通过实例解析了万能引用如何在左值和右值之间切换,并探讨了如何利用完美转发保持变量类型不变,以实现更高效、灵活的模板函数设计。
最低0.47元/天 解锁文章
6486

被折叠的 条评论
为什么被折叠?



