2016-06-21 136 views
14

我在看下面的(大概是C++ 14)的代码分配拉姆达

auto min_on = [](auto&& f) { 
    return [f=decltype(f)(f)](auto&& arg0, auto&&...args) { 
    // call your function here, using decltype(args)(args) to perfect forward 
    }; 
} 

是什么在lambda捕获列表怪异的分配?我从未在捕获列表中看到过任务

f=decltype(f)(f) 

这是如何工作的?

+0

当你返回一个函数时,你可以立即调用它 –

回答

14

这就是所谓的Generalized Lambda Capture,是的,它是C++ 14。

基本上它允许你创建一个新的变量作为捕获列表的一部分。从链路

文本:

在C++ 11,lambda表达式不能(容易地)通过移动捕获。在C++ 14中,我们有 广义lambda捕获,它不仅解决了这个问题,而且 允许您在lambda表达式中定义任意新的局部变量 对象。例如:

auto u = make_unique<some_type>(some, parameters); // a unique_ptr is move-only 
go.run([ u=move(u) ] { do_something_with(u); }); //move the unique_ptr into the lambda 

在上面的例子中,我们保留了变量u拉姆达内相同的 名称。但我们不 仅限于......我们可以重命名变量:

go.run([ u2=move(u) ] { do_something_with(u2); }); // capture as "u2" 

我们可以任意添加新的状态到拉姆达对象,因为 每个捕获创建 拉姆达内一个新的类型推断的局部变量:

int x = 4; 
int z = [&r = x, y = x+1] { 
      r += 2;   // set x to 6; "R is for Renamed Ref" 
      return y+2;  // return 7 to initialize z 
     }(); // invoke lambda 

在特定情况下,您有返回拉姆达一个lambda。通过使用这种新语法,嵌套lambda捕获f(它只是父lambda中的一个参数)。

+3

我会补充一点,在这种情况下'decltype(f)(f)'是一种写'std :: forward (f)实际上命名'T'。 – Brian

+0

@Brian你在说什么? – Dean

+0

@Dean推导为'auto'占位符的类型。 – Brian