我们知道在C ++中,lambda表达式可以通过副本(值)或引用来捕获局部变量,但为什么我可以捕获未在任何地方声明的变量(不在封闭范围内)?标准如何定义这种行为以及这种选择背后的动机是什么?
[{
Id: 1,
Name: N1,
TagIds: [T1, T2],
DepartmentId: D1,
Codes: [C1, C2]
},
{
Id: 2,
Name: N2,
TagIds: [T3],
DepartmentId: D2,
Codes: []
}]
答案 0 :(得分:1)
当在C ++ 11中首次引入lambdas时,您只能捕获其中的现有变量。但是,这在标准的后续迭代中得到了扩展,您现在可以为闭包类型定义成员,而无需捕获变量。这正是你在你的例子中所做的。
这种“捕获表达式”功能的更常见用途是通过值捕获仅移动类型:
std::unique_ptr<Foo> foo = whatever();
[p = std::move(foo)]() {
p->bar();
}