On Friday, 4 August 2017 at 17:18:41 UTC, Steven Schveighoffer
wrote:
On 8/4/17 12:57 PM, bitwise wrote:
[...]
Because the stack frame of foo or bar or baz is stored on the
heap BEFORE the function is entered. The compiler determines
that the stack frame will need to be captured, so it captures
it on function entry, not when the delegate is taken. Then the
variable location is reused for the loop, and all delegates
point at the same stack frame.
This is necessary for cases where the delegate may affect the
frame data during the function call. For instance:
void foo()
{
int i;
auto dg = { ++i;};
dg();
dg();
assert(i == 2);
}
What is needed is to allocate one frame per scope, and have the
delegate point at the right ones.
Note, the C++ behavior uses dangling stack pointers, and not
something we want to support in D.
-Steve
Thanks for clearing this up. Looking over my examples again, this
makes sense now. I suppose while this behavior is not ideal, it
does mean that I can safely throw lambdas that capture things
into a queue to be executed later, which was my main concern.
I wish this forum was a little more advanced so I could change
the post title I fudged and make this information more visible =/