On Saturday, 5 August 2017 at 18:17:49 UTC, Simon Bürger wrote:
If a lambda function uses a local variable, that variable is captured using a hidden this-pointer. But this capturing is always by reference. Example:

    int i = 1;
    auto dg = (){ writefln("%s", i); };
    i = 2;
    dg(); // prints '2'

Is there a way to make the delegate "capture by value" so that the call prints '1'?

Note that in C++, both variants are available using
   [&]() { printf("%d", i); }
   [=]() { printf("%d", i); }

I asked about this a couple of day ago:

The problem is that the lambda captures the entire enclosing stack frame. This is actually a bug because the lambda should only capture the enclosing *scope*, not the entire stack frame of the function. So even if you were to copy `i` into a temporary in some nested scope where a lambda was declared (this works in C# for example), that temporary would still reside in the same stack frame as the outer `i`, which means there would still be only one copy of it.

There is a workaround in Timon's post here:

Basically, that workaround wraps the nested scope in another lambda to force the creation of a separate stack frame.

Reply via email to