文章

C++ 右值引用,万能引用,完美转发

主要概念:

  • 引用的本质在C++内部实现是一个常指针。
  • 左值引用,右值引用。右值引用限制了其只能接收右值,可以利用这个特性从而提供重载。
  • template 万能引用,引用折叠。
  • 完美转发:std::forward 。

完美转发 std::forward

模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,我们希望能够在传递过程中保持它的左值或者右值的属性, 如果不使用forward,直接按照下面的方式写就会导致问题。

1
2
3
4
5
6
7
8
9
10
11
12
void RFn(int&& arg){

}

template<typename T>
void ProxyFn(T&& arg){
      RFn(arg);
}

void main(){
     ProxyFn(1);
}

会发现右值版本不能传过去, [int]无法到[int&&],就导致参数不匹配。

template_call_without_forward

本文由作者按照 CC BY 4.0 进行授权