Skip to content

Latest commit

 

History

History
42 lines (31 loc) · 1.19 KB

File metadata and controls

42 lines (31 loc) · 1.19 KB

条款33:对auto&&类型的形参使用decltype,以std::forward

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