lambda function with "capture by value"

bitwise via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 6 16:02:00 PDT 2017


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); }
> and
>    [=]() { printf("%d", i); }
> respectively.

I asked about this a couple of day ago:
http://forum.dlang.org/thread/ckkswkkvhfojbcczijim@forum.dlang.org

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:
http://forum.dlang.org/post/om2aqp$2e9t$1@digitalmars.com

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





More information about the Digitalmars-d-learn mailing list