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 =/

Reply via email to