在《Effective Modern C++》的lambda章节中,Scott Meyers说道:
考虑以下代码:
这段代码存在问题。 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;
using FilterContainer = std::vector<bool>;
定义过滤器,那么该引用可能会悬空? - Amadeusbool
,他就不必在第一时间处理悬空引用,因为所有的std::vector
中都只包含true
/false
值。但是他存储了返回bool
的std::function
,而返回值取决于除数,他需要计算bool
返回值。 - Andy