2310C++λ中完美转发

原文
C++11里面就引入了完美转发概念,通过它,可按参数实际类型转发参数.

<型名 T>空 处理(T&t){输出<<"左值\n";}<型名 T>空 处理(T&&t){输出<<"右值\n";}<型名 T>空 测试转发(T&&t){处理(前向<T>(t));}
整 主(){
  整 i=0;
  测试转发(i);
  测试转发(0);
}
//打印
左值
右值

传入左值i时,T&&t就是个左值引用,传入右值0时,T&&t就是个右值引用,再通过前向(t)完美转发参数到处理函数,处理函数输出结果符合期望.

但是在λ中,如何实现完美转发呢?

<型名 T>空 测试捕捉(T&&t){
  动 λ=[]()可变{
    处理();
  };
  λ();
}<型名 T>空 测试捕捉1(T&&t){
  动 λ=[&]()可变{
    处理();
  };
  λ();
}
测试捕捉(i);
测试捕捉(0);
//打印
左值
左值

λ无论是按值捕捉还是按引用捕捉,到调用处理时都是一个左值了,只会进入左值引用那个处理函数. C++20中支持完美抓(完美抓捕)的特性,和完美转发类似,可根据实际参数类型实现.

<型名 T>空 测试捕捉(T&&t){
  动 λ=[=前向<T>(t)]()可变{
    处理(前向<T>());
  };
  λ();
}

有了该转发λ捕捉,就得到了实际类型参数,接着通过完美转发调用处理就可得到符合期望结果了.
如果是可变模板参数,该怎么完美捕捉呢?

<型名...T>空 测试捕捉20(T&&...t){
  动 λ=[...=前向<T>(t)]()可变{
    处理(前向<T>()...);
  };
  λ();
}

C++17里能不能实现完美捕捉呢?也是可以的.

<型名...O>动 测试捕捉17(O&&...o){[o=造元组(前向<O>(o)...)]()可变{
    中 应用(
        [](&&...o){处理(前向<O>(o)...);},o);
  }();
}

你可能感兴趣的:(cpp,c++,c++)