有人问我为什么这段代码不能编译:
int main()
{
int a = 0;
int x = 3, y = 2, z = 1;
auto f = [&a,=]() { a = x + y + z; };
f();
}
Run Code Online (Sandbox Code Playgroud)
我已经在Visual Studio 2017和wccbox中检查了gcc HEAD 8.0.0 201708,这是真的,它不能编译.
第一个gcc错误就是:
error: expected identifier before '=' token
Run Code Online (Sandbox Code Playgroud)
与lambda一致,它在抱怨=条款中抱怨.
代码有什么问题?
And*_*dyG 14
对于lambda,默认捕获必须是第一个.
auto f = [=, &a]() { a = x + y + z; };
Run Code Online (Sandbox Code Playgroud)
只是为了补充安迪的答案,这里是标准参考:
Run Code Online (Sandbox Code Playgroud)lambda-expression: lambda-introducer lambda-declarator(opt) compound-statement lambda-introducer: [ lambda-capture(opt) ] lambda-capture: capture-default capture-list capture-default , capture-list
特别要注意的是,如果lambda捕获包含默认捕获和捕获列表,则语法要求它们按上面的顺序出现.