【发布时间】:2017-02-27 04:09:31
【问题描述】:
我注意到创建一个 lambda 然后进行复制会导致 lambda 中声明的静态变量和值可变变量捕获的不同行为。具体来说,当 lambda 被复制时,可变的状态被复制并变得独立于它被复制的 lambda。但是,lambda 内部的静态值在副本之间共享状态。
#include <iostream>
int main()
{
int i = 0;
auto f = [i]() mutable {
static int h=0;
std::cout << "mutable captured i by value=" << ++i << " static h=" << ++h << std::endl;
};
f(); // mutable captured i by value=1 static h=1
i = 10; // This shows that, as expected, changes in i are ignored by fc
auto fc = f;
f(); // mutable captured i by value=2 static h=2
f(); // mutable captured i by value=3 static h=3
fc(); // mutable captured i by value=2 static h=4
}
据此,我收集到 lambda 的副本共享相同的执行代码和任何保留状态,而且可变捕获的值不会在同一 lambda 的重复实例之间共享,即使它们在调用之间保留。
这种行为正确吗?我发现 this 关于 lambdas 中的静态,但没有遇到这种状态行为差异。
【问题讨论】: