int n; int main() { [](){ n = 0; }(); // clang says "ok" int m; [](){ m = 0; }(); // clang says "not ok" }
我只是好奇:
如果lambda没有捕获任何东西,是否允许根据C标准访问全局变量?
解决方法
[expr.prim.lambda]/7 … for purposes of name lookup … the compound-statement is considered in the context of the lambda-expression.
Re:为什么局部变量与全局变量不同.
[expr.prim.lambda]/13 … If a lambda-expression or an instantiation of the function call operator template of a generic lambda odr-uses (3.2)
this
or a variable with automatic storage duration from its reaching scope,that entity shall be captured by the lambda-expression.[expr.prim.lambda]/9 A lambda-expression whose smallest enclosing scope is a block scope (3.3.3) is a local lambda expression… The reaching scope of a local lambda expression is the set of enclosing scopes up to and including the innermost enclosing function and its parameters.
在你的例子中,m是一个变量,它具有从lambda到达范围的自动存储持续时间,因此将被捕获. n不是,所以不一定是.