https://issues.dlang.org/show_bug.cgi?id=2043
--- Comment #27 from Walter Bright <bugzi...@digitalmars.com> --- D closures are "by reference" rather than "by value". I make use of it being by reference all the time, as well as it being much more efficient. Changing it would likely break all sorts of code. So then the question is, what to do if you want it by value? One solution to creating such a delegate is to create it inside a nested function: import core.stdc.stdio; int main() { foreach (i; 0 .. 2) { void delegate(int) nested() { auto myi = i; // capture current value of i for use by del() void del(int x) // the real delegate { printf("&myi = %p\n", &myi); } return &del; } auto dg = nested(); dg(1); } return 0; } Running it: &myi = 00261014 &myi = 00261024 This works because `del` escapes its scope, and so the compiler allocates a closure each time nested() is called, and `myi` is captured in that closure. Now, the compiler could actually rewrite the delegate into the nested form above, but as I said, this changes the semantics of existing code, as well as being pretty inefficient. I doubt it would be acceptable. --