how to correctly populate an array of dynamic closures?

kdevel kdevel at vogtner.de
Thu Mar 29 20:26:59 UTC 2018


On Thursday, 29 March 2018 at 20:05:35 UTC, ag0aep6g wrote:
> On Thursday, 29 March 2018 at 19:02:51 UTC, kdevel wrote:
>> On Thursday, 29 March 2018 at 15:16:07 UTC, Ivan Kazmenko 
>> wrote:
> [...]
>>> 	int delegate () [] guns;
>>> 	foreach (i; 0..2) guns ~= () => i;
>>> 	foreach (i; 0..2) writeln (guns[i] ());  // 1 and 1, why?
>>
>> Isn't this undefined behavior? The first loop variable named 
>> "i" already went out of scope when the delegate is invoked.
>
> Not undefined behavior.

What is the lifetime of the first loop's variable i? What about 
this example:

``` bug2.d
import std.stdio;

void main ()
{
    int delegate () [] dg;
    foreach (i; 0..2) {
       int *j;
       if (i == 0) {
          auto k = i;
          j = &k;
       }
       else {
          auto l = i;
          j = &l;
       }
       dg ~= () => *j;
    }
    foreach (p; dg)
       p ().writeln;
}
```



More information about the Digitalmars-d-learn mailing list