在lambda中的分配

时间:2016-06-21 18:31:27

标签: c++ lambda

我正在查看以下(可能是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)

这是如何运作的?

1 个答案:

答案 0 :(得分:16)

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

基本上它允许您在捕获列表中创建一个新变量。

来自链接的文字:

  

在C ++ 11中,lambdas无法(轻松)通过移动捕获。在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 
     

在上面的例子中,我们保留了   lambda中变量u的名称相同。但我们不是   限于此...我们可以重命名变量:

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

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

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。嵌套的lambda使用这种新语法捕获f(它只是父lambda中的一个参数)。