C++11:可变的 lambda 似乎不会改变变量?
C++11: The mutable lambda doesn't seem to change the variable?
我在下面进行了快速测试:
#include<iostream>
using namespace std;
int main(){
int i=2;
auto f=[=]()mutable{++i;};
f();
f();
cout<<i<<endl;
return 0;
}
但是结果还是打印“2”。为什么我没有在可变 lambda 中被修改?我正在使用 clang --std=c++1z.
谢谢!
您使用 [=]
进行捕获,这意味着 lambda 获得 i
的副本。此副本独立于 main
.
中的 i
您需要做的是通过引用捕获 [&]
,以便将更改应用到 main
中的 i
。
[=]
表示您正在按值捕获 i
。即使是可变的 lambda 也可以修改它,但它只是 lambda 内部的一个副本,那么对它的任何修改都与原始变量无关。
您可能需要 capture-by-reference,然后就不再需要 mutable
。例如
auto f = [&i]() {++i;};
int i=2;
auto f=[=]()mutable{++i;};
f();
f();
std::cout<<i<<std::endl;
这会打印 2。
int i=2;
auto f=[&](){++i;};
f();
f();
std::cout<<i<<std::endl;
这会打印 4。
int i=2;
auto f=[=]()mutable{++i; std::cout << i << std::endl;};
f();
f();
std::cout<<i<<std::endl;
这会打印出 3 4 2。
=
将捕获的数据复制到 lambda 中。
如果mutable
可以修改份。
&
references 在 lambda 中捕获数据。
通过引用修改事物是合法的。
[=]
等同于[i]
,[&]
等同于[&i]
在此上下文中(可以显式列出捕获,或者让捕获隐含地列出 none 并使用 =
或 &
).
我在下面进行了快速测试:
#include<iostream>
using namespace std;
int main(){
int i=2;
auto f=[=]()mutable{++i;};
f();
f();
cout<<i<<endl;
return 0;
}
但是结果还是打印“2”。为什么我没有在可变 lambda 中被修改?我正在使用 clang --std=c++1z.
谢谢!
您使用 [=]
进行捕获,这意味着 lambda 获得 i
的副本。此副本独立于 main
.
i
您需要做的是通过引用捕获 [&]
,以便将更改应用到 main
中的 i
。
[=]
表示您正在按值捕获 i
。即使是可变的 lambda 也可以修改它,但它只是 lambda 内部的一个副本,那么对它的任何修改都与原始变量无关。
您可能需要 capture-by-reference,然后就不再需要 mutable
。例如
auto f = [&i]() {++i;};
int i=2;
auto f=[=]()mutable{++i;};
f();
f();
std::cout<<i<<std::endl;
这会打印 2。
int i=2;
auto f=[&](){++i;};
f();
f();
std::cout<<i<<std::endl;
这会打印 4。
int i=2;
auto f=[=]()mutable{++i; std::cout << i << std::endl;};
f();
f();
std::cout<<i<<std::endl;
这会打印出 3 4 2。
=
将捕获的数据复制到 lambda 中。
如果mutable
可以修改份。
&
references 在 lambda 中捕获数据。
通过引用修改事物是合法的。
[=]
等同于[i]
,[&]
等同于[&i]
在此上下文中(可以显式列出捕获,或者让捕获隐含地列出 none 并使用 =
或 &
).