On 06/04/2013 11:38 PM, Nick Sabalausky wrote:
On Tue, 04 Jun 2013 23:24:51 +0200
Timon Gehr <timon.g...@gmx.ch> wrote:

On 06/04/2013 11:03 PM, Nick Sabalausky wrote:
...

So when you put the delegate creation in a loop:

      foreach(a; iota(0..6))
          dg = () => a;

It *is* expected that you're *not* sticking 0, 1, 2, 3, etc inside
the delegate. That's because you're not evaluating "a" *at all*
here, you're just crerates a delegate that *refers* to "a" itself.
You're just creating the exact same delegate five times. In other
words:

You're just saying:
Store the following set of instructions into 'dg': "Read the value
of 'a' and then return it."

You're *not* saying:
Read the value of 'a' and *then* create a delegate that returns that
value.



'a' refers to a different location for every loop iteration. This is
a language change in 2.063.


foreach(a;0..5)
     writeln(&a);

For me, that prints the same address five times in both 2.062 and
2.063.

It does not matter. The lifetimes of the different a's do not overlap.

I would argue that's as it should be.


That argument would be mistaken. The compiler is free to eg. unroll the loop completely and use different addresses.

Behind the scenes, the foreach loop is rewritten to something like:

for(int __a=0;__a<5;__a++){
    int a = __a;
    writeln(&a);
}

Reply via email to