我正在编写传递对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捕获,情况并非如此。 这是标准的预期行为,如果是这样,为什么这与正常的参考行为不同?
答案 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
最初宣布为参考资料并不重要。