将引用和指针传递给lambdas

时间:2017-08-26 17:09:03

标签: c++ c++11 closures

我正在编写传递对lambda表达式的引用的代码,所以我决定使用g ++ - 7

查看几个简单的例子。

代码:

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

打印

incrementing i to  3
i = 2

正如预期的那样,因为lamda会为i制作一份副本以供日后使用:

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

打印

incrementing i to  4
j = 3

尚未:

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

打印

incrementing i to  5
*k = 5

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

2 个答案:

答案 0 :(得分:3)

除非在捕获中使用&,否则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.

答案 1 :(得分:0)

传递i作为参考用途

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

(注意捕获中的&前缀)

i最初宣布为参考资料并不重要。