原文
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);
}();
}