在C++中,你可以像这样声明lambdas:
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << '\n'; };
auto b = [&]() { ++x; std::cout << x << '\n'; };
Run Code Online (Sandbox Code Playgroud)
两个都让我修改x
,那有什么区别?
Seb*_*ach 85
第一个只修改自己的副本,x
并x
保持外部不变.第二个将修改外部x
.
尝试每个后添加一个print语句:
a();
std::cout << x << "----\n";
b();
std::cout << x << '\n';
Run Code Online (Sandbox Code Playgroud)
预计这将打印:
6
5
----
6
6
Run Code Online (Sandbox Code Playgroud)
考虑lambda可能会有所帮助
[...]表达式提供了创建简单函数对象的简洁方法
(参见标准的[expr.prim.lambda])
他们有
[...]公共内联函数调用操作符[...]
它被声明为const
成员函数,但仅限于
[...]当且仅当lambda表达式的parameter-declaration-clause未被跟随时
mutable
你可以想到
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << '\n'; };
==>
int x = 5;
class __lambda_a {
int x;
public:
__lambda_a () : x($lookup-one-outer$::x) {}
inline void operator() { ++x; std::cout << x << '\n'; }
} a;
Run Code Online (Sandbox Code Playgroud)
和
auto b = [&]() { ++x; std::cout << x << '\n'; };
==>
int x = 5;
class __lambda_b {
int &x;
public:
__lambda_b() : x($lookup-one-outer$::x) {}
inline void operator() const { ++x; std::cout << x << '\n'; }
// ^^^^^
} b;
Run Code Online (Sandbox Code Playgroud)
问:但如果它是一个const
功能,为什么我还能改变x
?
答:你只是在改变外面x
.lambda自己x
是一个引用,操作++x
不会修改引用,而是修改引用的值.
这是有效的,因为在C++中,指针/引用的常量不会改变通过它看到的指针/引用的常量.
归档时间: |
|
查看次数: |
6122 次 |
最近记录: |