组合lambda捕获时编译错误

Kat*_*ory 7 c++ c++11

有人问我为什么这段代码不能编译:

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)

现场演示


Sto*_*ica 5

只是为了补充安迪的答案,这里是标准参考:

[expr.prim.lambda/1]

lambda-expression:
    lambda-introducer lambda-declarator(opt) compound-statement

lambda-introducer:
    [ lambda-capture(opt) ]

lambda-capture:
    capture-default
    capture-list
    capture-default , capture-list
Run Code Online (Sandbox Code Playgroud)

特别要注意的是,如果lambda捕获包含默认捕获和捕获列表,则语法要求它们按上面的顺序出现.