为什么我可以在C ++中捕获可变lambda中未声明的变量

时间:2018-05-30 15:12:45

标签: c++ lambda declaration capture

我们知道在C ++中,lambda表达式可以通过副本(值)或引用来捕获局部变量,但为什么我可以捕获未在任何地方声明的变量(不在封闭范围内)?标准如何定义这种行为以及这种选择背后的动机是什么?

[{
    Id: 1,
    Name: N1,
    TagIds: [T1, T2],
    DepartmentId: D1,
    Codes: [C1, C2]
},
{
    Id: 2,
    Name: N2,
    TagIds: [T3],
    DepartmentId: D2,
    Codes: []
}]

1 个答案:

答案 0 :(得分:1)

当在C ++ 11中首次引入lambdas时,您只能捕获其中的现有变量。但是,这在标准的后续迭代中得到了扩展,您现在可以为闭包类型定义成员,而无需捕获变量。这正是你在你的例子中所做的。

这种“捕获表达式”功能的更常见用途是通过值捕获仅移动类型:

std::unique_ptr<Foo> foo = whatever();
[p = std::move(foo)]() {
  p->bar();
}
相关问题