有人可以告诉我以下的例子:
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将引用相同的捕获变量.
可以写一些例子:
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)