擅长:python、mysql、java
<p>原因是这是未定义的行为。在</p>
<p>内部lambda通过引用捕获<code>x</code>。在</p>
<p>问题是一旦<code>add()</code>返回,它的参数就会被销毁,而返回的lambda有一个指向已销毁对象的悬挂引用。在</p>
<p>lambda必须按值捕获<code>x</code>;在我看来,您真正要做的是一个<a href="http://en.cppreference.com/w/cpp/language/lambda">mutable lambda</a>:</p>
<pre><code>auto add(int x) {
function<int(void)> g = [x]() mutable {return ++x;};
return g;
}
</code></pre>
<p>请注意,在随后复制返回的lambda时,这种方法具有一定的含义;但是只要返回的lambda在其剩余的生命周期中保持“在一个位置”,所得到的语义可能就是您所期望的。在</p>