【发布时间】:2015-10-24 12:51:06
【问题描述】:
Scott Meyers,在 Effective Modern C++ 中,在 lambda 章节中说:
考虑以下代码:
void addDivisorFilter()
{
auto calc1 = computeSomeValue1();
auto calc2 = computeSomeValue2();
auto divisor = computeDivisor(calc1, calc2);
filters.emplace_back(
[&](int value) { return value % divisor == 0; }
);
}
此代码是一个等待发生的问题。 lambda 引用局部变量
divisor,但当addDivisorFilter返回时,该变量不再存在。那是在filters.emplace_back返回之后,所以添加到filters的函数在到达时基本上是死的。使用该过滤器几乎从创建的那一刻起就会产生未定义的行为。
问题是:为什么它是未定义的行为?据我了解,filters.emplace_back 仅在 lambda 表达式完成后返回,并且在执行期间,divisor 有效。
更新
我错过的一个重要数据是:
using FilterContainer = std::vector<std::function<bool(int)>>;
FilterContainer filters;
【问题讨论】: