将引用和指针传递给 lambda

Passing references and pointers to lambdas

本文关键字:lambda 指针 引用      更新时间:2023-10-16

我正在编写传递对lambda表达式的引用的代码,所以我决定使用g ++ -7查看一些简单的示例

代码:

int i = 2;
auto f = [i]() {
printf("i = %dn", i);
};
printf("incrementing i to  %dn", ++i);
f();

指纹

incrementing i to  3
i = 2

正如预期的那样,因为Lamda复制了i以供以后使用,并且:

int i = 3;
int& j = i;
auto g = [j]() {
printf("j = %dn", j);
};
printf("incrementing i to  %dn", ++i);
g();

指纹

incrementing i to  4
j = 3

还:

i = 4;
int* k = &i;
auto h = [k]() {
printf("*k = %dn", *k);
};
printf("incrementing i to  %dn", ++i);
h();

指纹

incrementing i to  5
*k = 5

现在通常引用的行为类似于不需要取消引用(并且无法更改(的指针,但对于 lamda 捕获,情况并非如此。 这是标准的预期行为吗?如果是,为什么这与正常的参考行为不同?

除非您在捕获中使用&,否则 lambda 表达式将按值捕获。无论你是捕获i还是j,除非你使用&i&j,否则变量都是按值捕获的。

这与常规功能没有什么不同。

void foo(int i) {}
void bar(int& i) {}
int i;
int& j = i;
foo(i); // Passed by value
foo(j); // Passed by value also.
bar(i); // Passed by reference
bar(j); // Passed by reference also.

传递i作为参考使用

auto f = [&i]() {
printf("i = %dn", i);
};

(请注意捕获中的&前缀(

无论最初是否i被声明为参考并不重要。