上篇文章我们讲了移动语义相关知识
本篇文章我们介绍下std::forward,我们会讲到引用折叠,完美转发,及std::forward与std::move进行比较
1 引用折叠
我们都知道通常情况下不能将一个右值引用绑定到左值上,即:
int i = 0;
int &&ii = i; // error
当然也有例外的情况,左值传递给右值引用参数,且右值引用指向模板类型参数(T&&)
template<typename T>
void foo(T&& u) {
std::cout << u;
}
int main() {
int i = 0;
foo(i);
return 0;
}
这时编译器推断类型是为实参的左值引用类型(int&), 那么foo的类型就是int & &&,在这时就会发生引用折叠。折叠的规则为,以X类型为例:
- X& &,X& &&和X&& &都折叠成X&
- X&& &&折叠成X&&
2 完美转发
某些函数需要将其一个甚至多个参数连同类型不变的转发给其他函数。
即通过函数转发保证参数的左值/右值,const/non-const属性不变。
封装一个通用的f函数转发给g,我们看下如果来写f函数
template<typename T>
void f(/*这里应该如何写*/ t) {
g(t);
}

本文详细介绍了C++中的std::forward函数,包括引用折叠、完美转发的概念,并与std::move进行了比较。同时,通过STL中的实例展示了std::forward的具体应用。
最低0.47元/天 解锁文章
3406

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



