C++ 11 lambda:混合捕获列表

Bar*_*ich 12 c++ lambda c++11

有人可以告诉我以下的例子:

1)x按值捕获的Lambda .y引用.如果未指定,其余的默认值是什么?

2)x按值捕获的Lambda .y通过引用,所有其他的价值.

3)x按价值捕获的Lambda .y通过引用,所有其他参考.

此外,允许同一范围内的2个lambda具有相同的捕获签名,例如两者都是[],或者两者都是[&x,=]

谢谢

Elo*_*eth 13

1)[x, &y](){}没有捕获休息

2) [=, &y](){}

3) [&, x](){}

捕获列表是以逗号分隔的零个或多个捕获列表,可选地以capture-default开头.唯一的捕获默认值是&(通过引用)和=(按值).如果使用capture-default,则其他捕获不能使用相同的捕获类型.任何捕获可能只出现一次.

此外,是否允许同一范围内的2个lambda具有相同的捕获签名,例如两者都是[],或者两者都是[&x,=]

当然是允许的.每个lambda都是不同的对象,并且具有不同的类型.如果你在两个lambda中按值捕获变量,那么每个lambda都有它的副本.如果您通过引用在两个lambda中捕获变量,那么每个lambda将引用相同的捕获变量.


Bar*_*rry 8

可以写一些例子:

int x = 7, y = 12, z = 24;

auto lambda1 = [x, &y]{
    // can't do this...
    // std::cout << "x=" << x << ", y=" << y << ", z=" << z << std::endl;
    std::cout << "x=" << x << ", y=" << y << std::endl;
};

auto lambda2 = [=, x, &y]{
    std::cout << "x=" << x << ", y=" << y << ", z=" << z << std::endl;
};

auto lambda3 = [&, x, &y]{
    std::cout << "x=" << x << ", y=" << y << ", z=" << z << std::endl;
};

++x, ++y, ++z;
lambda1();
lambda2();
lambda3();
Run Code Online (Sandbox Code Playgroud)

现在,lambda1这里不能用z.没有"隐式"捕获,因为我们没有=&指定并且z没有出现在捕获列表中,我们无法z在那里打印.如果我们尝试使用我已注释掉的那一行,那就错了.

另外两个很好,分别打印7,13,24和7,13,25.需要注意的是,=&必须是第一位的.此外,鉴于我们通过值/引用捕获所有内容,其他捕获之一是多余的,因此我们可以完成:

auto lambda2 = [=, &y]{ ... };
auto lambda3 = [&, x]{ ... };
Run Code Online (Sandbox Code Playgroud)