我正在查看以下(可能是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 :(得分: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中的一个参数)。