泛型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)...));
};