泛型lambda表达式是C++14的特性之一,lambda表达式可以在形参中使用 auto。
给定下面lambda表达式:
auto f = [](auto x){ return func(normalize(x)); };如果 normalize 区分左右值,那么lambda表达式的撰写是有问题的,因为lambda表达式总会传递左值给它。
正确撰写方式是把 x 完美转发给 normalize :
auto f = [](auto&& x)
{ return func(normalize(std::forward<???>(x))); }; 问题在于传递给 std::forward 的形参应该是什么类型?
根据 decltype 推导规则和引用折叠规则,把 decltype(x) 产生的类型传递给 std::forward 就能得到想要的结果。我们的完美转发lambda表达式可以编写如下:
auto f =
[](auto&& param)
{
return
func(normalize(std::forward<decltype(param)>(param)));
};在此基础上稍加改动,就可以得到变长形参的完美转发lambda表达式:
auto f =
[](auto&&... params)
{
return
func(normalize(std::forward<decltype(params)>(params)...));
};